package lnwire

import "testing"

// TestChannelIDOutPointConversion ensures that the IsChanPoint always
// recognizes its seed OutPoint for all possible values of an output index.
func TestChannelIDOutPointConversion(t *testing.T) {
	t.Parallel()

	testChanPoint := *outpoint1

	// For a given OutPoint, we'll run through all the possible output
	// index values, mutating our test outpoint to match that output index.
	var prevChanID ChannelID
	for i := uint32(0); i < MaxFundingTxOutputs; i++ {
		testChanPoint.Index = i

		// With the output index mutated, we'll convert it into a
		// ChannelID.
		cid := NewChanIDFromOutPoint(&testChanPoint)

		// Once the channel point has been converted to a channelID, it
		// should recognize its original outpoint.
		if !cid.IsChanPoint(&testChanPoint) {
			t.Fatalf("channelID not recognized as seed channel "+
				"point: cid=%v, op=%v", cid, testChanPoint)
		}

		// We also ensure that the channel ID itself have changed
		// between iterations. This case is meant to catch an issue
		// where the transformation function itself is a no-op.
		if prevChanID == cid {
			t.Fatalf("#%v: channelID not modified: old=%v, new=%v",
				i, prevChanID, cid)
		}

		prevChanID = cid
	}
}

// TestGenPossibleOutPoints ensures that the GenPossibleOutPoints generates a
// valid set of outpoints for a channelID. A set of outpoints is valid iff, the
// root outpoint (the outpoint that generated the ChannelID) is included in the
// returned set of outpoints.
func TestGenPossibleOutPoints(t *testing.T) {
	t.Parallel()

	// We'll first convert out test outpoint into a ChannelID.
	testChanPoint := *outpoint1
	testChanPoint.Index = 24
	chanID := NewChanIDFromOutPoint(&testChanPoint)

	// With the chan ID created, we'll generate all possible root outpoints
	// given this channel ID.
	possibleOutPoints := chanID.GenPossibleOutPoints()

	// If we run through the generated possible outpoints, the original
	// root outpoint MUST be found in this generated set.
	var opFound bool
	for _, op := range possibleOutPoints {
		if op == testChanPoint {
			opFound = true
			break
		}
	}

	// If we weren't able to locate the original outpoint in the set of
	// possible outpoints, then we'll fail the test.
	if !opFound {
		t.Fatalf("possible outpoints did not contain the root outpoint")
	}
}