88 See http://swift.org/CONTRIBUTORS.txt for Swift project authors
99 */
1010
11-
1211import func Basics. nextItem
12+ @testable import func Basics. containsNonContiguousSubset
13+ @testable import func Basics. containsContiguousSubset
1314import Testing
1415@Suite
1516struct ArrayHelpersTests {
@@ -29,4 +30,113 @@ struct ArrayHelpersTests {
2930 #expect( nextItem ( in: [ 1 ] , after: 1 ) == nil )
3031 #expect( nextItem ( in: [ 0 , 1 , 12 , 1 , 4 ] , after: 1 ) == 12 )
3132 }
33+
34+ @Test (
35+ . tags(
36+ Tag . TestSize. small,
37+ ) ,
38+ )
39+ func containsNonContiguousSubsetReturnsExpectedValue( ) async throws {
40+ // Empty subset should always return true
41+ #expect( containsNonContiguousSubset ( array: [ ] as [ String ] , subset: [ ] ) == true )
42+ #expect( containsNonContiguousSubset ( array: [ ] as [ Int ] , subset: [ ] ) == true )
43+ #expect( containsNonContiguousSubset ( array: [ ] as [ Bool ] , subset: [ ] ) == true )
44+ #expect( containsNonContiguousSubset ( array: [ 1 , 2 , 3 ] , subset: [ ] ) == true )
45+
46+ // Empty array with non-empty subset should return false
47+ #expect( containsNonContiguousSubset ( array: [ ] as [ Int ] , subset: [ 1 ] ) == false )
48+
49+ // Single element tests
50+ #expect( containsNonContiguousSubset ( array: [ 1 ] , subset: [ 1 ] ) == true )
51+ #expect( containsNonContiguousSubset ( array: [ 1 ] , subset: [ 2 ] ) == false )
52+
53+ // Basic subset tests - all elements present
54+ #expect( containsNonContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 1 , 3 , 5 ] ) == true )
55+ #expect( containsNonContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 5 , 1 , 3 ] ) == true ) // Order doesn't matter
56+ #expect( containsNonContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 2 , 4 ] ) == true )
57+
58+ // Missing elements tests
59+ #expect( containsNonContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 1 , 6 ] ) == false )
60+ #expect( containsNonContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 6 , 7 , 8 ] ) == false )
61+
62+ // Duplicate elements in subset
63+ #expect( containsNonContiguousSubset ( array: [ 1 , 2 , 2 , 3 , 4 ] , subset: [ 2 , 2 ] ) == true )
64+ #expect( containsNonContiguousSubset ( array: [ 1 , 2 , 3 , 4 ] , subset: [ 2 , 2 ] ) == true ) // Only one 2 in array, but still contains 2
65+
66+ // String tests
67+ #expect( containsNonContiguousSubset ( array: [ " a " , " b " , " c " , " d " ] , subset: [ " a " , " c " ] ) == true )
68+ #expect( containsNonContiguousSubset ( array: [ " a " , " b " , " c " , " d " ] , subset: [ " d " , " a " ] ) == true )
69+ #expect( containsNonContiguousSubset ( array: [ " a " , " b " , " c " , " d " ] , subset: [ " e " ] ) == false )
70+
71+ // Subset same size as array
72+ #expect( containsNonContiguousSubset ( array: [ 1 , 2 , 3 ] , subset: [ 3 , 2 , 1 ] ) == true )
73+ #expect( containsNonContiguousSubset ( array: [ 1 , 2 , 3 ] , subset: [ 1 , 2 , 4 ] ) == false )
74+
75+ // Subset larger than array
76+ #expect( containsNonContiguousSubset ( array: [ 1 , 2 ] , subset: [ 1 , 2 , 3 ] ) == false )
77+ }
78+
79+ @Test (
80+ . tags(
81+ Tag . TestSize. small,
82+ ) ,
83+ )
84+ func containsContiguousSubsetReturnsExpectedValue( ) async throws {
85+ // Empty subset should always return true
86+ #expect( containsContiguousSubset ( array: [ ] as [ String ] , subset: [ ] ) == true )
87+ #expect( containsContiguousSubset ( array: [ ] as [ Int ] , subset: [ ] ) == true )
88+ #expect( containsContiguousSubset ( array: [ ] as [ Bool ] , subset: [ ] ) == true )
89+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 ] , subset: [ ] ) == true )
90+
91+ // Empty array with non-empty subset should return false
92+ #expect( containsContiguousSubset ( array: [ ] as [ Int ] , subset: [ 1 ] ) == false )
93+
94+ // Single element tests
95+ #expect( containsContiguousSubset ( array: [ 1 ] , subset: [ 1 ] ) == true )
96+ #expect( containsContiguousSubset ( array: [ 1 ] , subset: [ 2 ] ) == false )
97+
98+ // Basic contiguous subset tests
99+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 2 , 3 , 4 ] ) == true )
100+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 1 , 2 ] ) == true )
101+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 4 , 5 ] ) == true )
102+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 1 , 2 , 3 , 4 , 5 ] ) == true ) // Entire array
103+
104+ // Non-contiguous elements should return false
105+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 1 , 3 , 5 ] ) == false )
106+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 2 , 4 ] ) == false )
107+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 1 , 3 ] ) == false )
108+
109+ // Wrong order should return false
110+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 3 , 2 , 1 ] ) == false )
111+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 5 , 4 , 3 ] ) == false )
112+
113+ // Missing elements
114+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 1 , 6 ] ) == false )
115+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 , 5 ] , subset: [ 6 , 7 ] ) == false )
116+
117+ // Duplicate elements
118+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 2 , 3 , 4 ] , subset: [ 2 , 2 , 3 ] ) == true )
119+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 2 , 4 ] , subset: [ 2 , 2 ] ) == false ) // 2s are not contiguous
120+ #expect( containsContiguousSubset ( array: [ 1 , 1 , 2 , 3 ] , subset: [ 1 , 1 ] ) == true )
121+
122+ // String tests
123+ #expect( containsContiguousSubset ( array: [ " a " ] , subset: [ " b " , " c " ] ) == false )
124+ #expect( containsContiguousSubset ( array: [ " a " ] , subset: [ ] ) == true )
125+ #expect( containsContiguousSubset ( array: [ " a " , " b " , " c " , " d " ] , subset: [ " b " , " c " ] ) == true )
126+ #expect( containsContiguousSubset ( array: [ " a " , " b " , " c " , " d " ] , subset: [ " a " , " c " ] ) == false ) // Not contiguous
127+ #expect( containsContiguousSubset ( array: [ " hello " , " world " , " test " ] , subset: [ " world " , " test " ] ) == true )
128+
129+ // Subset larger than array
130+ #expect( containsContiguousSubset ( array: [ 1 , 2 ] , subset: [ 1 , 2 , 3 ] ) == false )
131+
132+ // Multiple occurrences - should find first match
133+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 1 , 2 , 3 ] , subset: [ 1 , 2 ] ) == true )
134+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 1 , 2 , 3 ] , subset: [ 2 , 3 ] ) == true )
135+
136+ // Edge case: subset at the end
137+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 ] , subset: [ 3 , 4 ] ) == true )
138+
139+ // Edge case: subset at the beginning
140+ #expect( containsContiguousSubset ( array: [ 1 , 2 , 3 , 4 ] , subset: [ 1 , 2 ] ) == true )
141+ }
32142}
0 commit comments