package constants

import "testing"

func TestConnectorQueueGeneratedConstantsExposeSystemTables(t *testing.T) {
	requiredTables := []string{
		TableConnectorWorkItem,
		TableConnectorSchedulerLease,
	}
	for _, tableName := range requiredTables {
		if !containsString(AllSystemTableNames, tableName) {
			t.Fatalf("AllSystemTableNames missing %s", tableName)
		}
	}

	if TableConnectorWorkItem != "_System_ConnectorWorkItem" {
		t.Fatalf("TableConnectorWorkItem = %q", TableConnectorWorkItem)
	}
	if TableConnectorSchedulerLease != "_System_ConnectorSchedulerLease" {
		t.Fatalf("TableConnectorSchedulerLease = %q", TableConnectorSchedulerLease)
	}
}

func TestConnectorQueueGeneratedColumnsExposeClaimSchema(t *testing.T) {
	wantWorkItemColumns := []string{
		FieldSysConnectorWorkItem_WorkID,
		FieldSysConnectorWorkItem_EventID,
		FieldSysConnectorWorkItem_InstalledPackID,
		FieldSysConnectorWorkItem_WorkType,
		FieldSysConnectorWorkItem_QueueClass,
		FieldSysConnectorWorkItem_State,
		FieldSysConnectorWorkItem_RunAfter,
		FieldSysConnectorWorkItem_Attempt,
		FieldSysConnectorWorkItem_OwnershipEpoch,
		FieldSysConnectorWorkItem_FailureCount,
		FieldSysConnectorWorkItem_FailureClass,
		FieldSysConnectorWorkItem_FailureSummary,
		FieldSysConnectorWorkItem_LastFailureAt,
		FieldSysConnectorWorkItem_TerminalAt,
		FieldSysConnectorWorkItem_ReplayedAt,
		FieldSysConnectorWorkItem_ReplayOfWorkID,
		FieldSysConnectorWorkItem_LaneOrdinal,
		FieldSysConnectorWorkItem_LeaseOwner,
		FieldSysConnectorWorkItem_LeaseToken,
		FieldSysConnectorWorkItem_LeaseUntil,
		FieldSysConnectorWorkItem_SourceLaneKey,
		FieldSysConnectorWorkItem_TargetMutationLaneKey,
		FieldSysConnectorWorkItem_Generation,
		FieldSysConnectorWorkItem_ProjectionKey,
		FieldSysConnectorWorkItem_ProjectionActiveKey,
		FieldSysConnectorWorkItem_DependencyKind,
		FieldSysConnectorWorkItem_DependencyObjectAPIName,
		FieldSysConnectorWorkItem_DependencyRecordID,
		FieldSysConnectorWorkItem_DependencyKeyHash,
		FieldSysConnectorWorkItem_DependencyConnectorOwnerKey,
		FieldSysConnectorWorkItem_DependencyConnectorNamespace,
		FieldSysConnectorWorkItem_DependencyConnectorSourceObject,
		FieldSysConnectorWorkItem_DependencyDestinationSlotID,
		FieldSysConnectorWorkItem_DependencyConnectorRemoteID,
		FieldSysConnectorWorkItem_DependencyBlockedAt,
		FieldSysConnectorWorkItem_DependencyProbeAfter,
		FieldCreatedDate,
		FieldLastModifiedDate,
	}
	if !sameStringSlice(ColsSystemConnectorWorkItem, wantWorkItemColumns) {
		t.Fatalf("ColsSystemConnectorWorkItem = %#v, want %#v", ColsSystemConnectorWorkItem, wantWorkItemColumns)
	}

	wantLeaseColumns := []string{
		FieldSysConnectorSchedulerLease_InstalledPackID,
		FieldSysConnectorSchedulerLease_Generation,
		FieldSysConnectorSchedulerLease_OwnerID,
		FieldSysConnectorSchedulerLease_FencingToken,
		FieldSysConnectorSchedulerLease_LeaseUntil,
		FieldSysConnectorSchedulerLease_RenewedAt,
		FieldCreatedDate,
		FieldLastModifiedDate,
	}
	if !sameStringSlice(ColsSystemConnectorSchedulerLease, wantLeaseColumns) {
		t.Fatalf("ColsSystemConnectorSchedulerLease = %#v, want %#v", ColsSystemConnectorSchedulerLease, wantLeaseColumns)
	}
}

func containsString(values []string, want string) bool {
	for _, value := range values {
		if value == want {
			return true
		}
	}
	return false
}

func sameStringSlice(got, want []string) bool {
	if len(got) != len(want) {
		return false
	}
	for i := range got {
		if got[i] != want[i] {
			return false
		}
	}
	return true
}
