55// Created by Lennard Sprong on 08/07/2025.
66//
77
8- #if compiler(>=6.2)
98import Testing
9+
1010@testable import PropertyBased
1111
1212@Suite struct GenFrequencyTests {
@@ -16,13 +16,29 @@ import Testing
1616 case text( String )
1717 }
1818
19- let gen = Gen . oneOf (
19+ // MARK: oneOf
20+
21+ static let unpackedGen = Gen . oneOf (
22+ Gen . always ( Choice . plain) . eraseToAny ( ) ,
23+ Gen . int ( ) . map ( Choice . number) . eraseToAny ( ) ,
24+ Gen . lowercaseLetter. string ( of: 8 ) . map ( Choice . text) . eraseToAny ( ) ,
25+ )
26+
27+ #if compiler(>=6.2)
28+ static let packedGen = Gen . oneOf (
2029 Gen . always ( Choice . plain) ,
2130 Gen . int ( ) . map ( Choice . number) ,
2231 Gen . lowercaseLetter. string ( of: 8 ) . map ( Choice . text) ,
2332 )
2433
25- @Test func testGenerateEnum( ) async {
34+ static let generators = [ ( 0 , unpackedGen) , ( 1 , packedGen) ]
35+ #else
36+ static let generators = [ ( 0 , unpackedGen) ]
37+ #endif // compiler(>=6.2)
38+
39+ @Test ( arguments: generators)
40+ func testGenerateEnum( _ pair: ( Int , Generator < Choice , AnySequence < ( index: Int , value: Any ) > > ) ) async {
41+ let gen = pair. 1
2642 await testGen ( gen)
2743
2844 await confirmation ( expectedCount: 1 ... ) { confirm1 in
@@ -43,12 +59,43 @@ import Testing
4359 }
4460 }
4561
46- @Test func testShrinkChoice( ) async throws {
62+ @Test ( arguments: generators)
63+ func testShrinkChoice( _ pair: ( Int , Generator < Choice , AnySequence < ( index: Int , value: Any ) > > ) ) async throws {
64+ let gen = pair. 1
4765 let value = ( index: 1 , value: 500 as Any )
4866 let results = gen. _shrinker ( value) . compactMap ( gen. _mapFilter)
4967 try #require( results. count > 1 )
5068 #expect( results. first == . number( 0 ) )
5169 #expect( !results. contains ( . number( 500 ) ) )
5270 }
71+
72+ // MARK: frequency
73+
74+ static let unpackedFreqGen = Gen< Choice> . frequency( [
75+ ( 1 , Gen . int ( ) . map ( Choice . number) . eraseToAny ( ) ) ,
76+ ( 2.0 , Gen . lowercaseLetter. string ( of: 8 ) . map ( Choice . text) . eraseToAny ( ) ) ,
77+ ( 0 , Gen . always ( Choice . plain) . eraseToAny ( ) ) ,
78+ ] )
79+
80+ #if compiler(>=6.2)
81+ static let packedFreqGen = Gen . frequency (
82+ ( 1 , Gen . int ( ) . map ( Choice . number) ) ,
83+ ( 2 , Gen . lowercaseLetter. string ( of: 8 ) . map ( Choice . text) ) ,
84+ ( 0 , Gen . always ( Choice . plain) ) ,
85+ )
86+
87+ static let freqGenerators = [ ( 0 , unpackedFreqGen) , ( 1 , packedFreqGen) ]
88+ #else
89+ static let freqGenerators = [ ( 0 , unpackedFreqGen) ]
90+ #endif // compiler(>=6.2)
91+
92+ @Test ( arguments: freqGenerators)
93+ func testGenerateWithFrequency( _ pair: ( Int , Generator < Choice , AnySequence < ( index: Int , value: Any ) > > ) ) async {
94+ let gen = pair. 1
95+ await testGen ( gen)
96+
97+ await propertyCheck ( count: 200 , input: gen) { item in
98+ #expect( item != . plain)
99+ }
100+ }
53101}
54- #endif // compiler(>=6.2)
0 commit comments