Skip to content

Commit 3d320f6

Browse files
committed
Add rest of tests
1 parent cd4763f commit 3d320f6

File tree

2 files changed

+62
-11
lines changed

2 files changed

+62
-11
lines changed

Sources/PropertyBased/Gen+Frequency.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ extension Gen {
1414
)
1515
}
1616

17-
public static func frequency<Input>(_ generators: [(rate: Float, gen: Generator<Value, AnySequence<Input>>)])
17+
public static func frequency<Input>(
18+
_ generators: [(rate: FloatLiteralType, gen: Generator<Value, AnySequence<Input>>)]
19+
)
1820
-> Generator<Value, AnySequence<(index: Int, value: Input)>>
1921
{
20-
var total: Float = 0
22+
var total: FloatLiteralType = 0
2123
let options = generators.map { rate, gen in
2224
precondition(rate >= 0, "Rate must be non-negative, found a rate of \(rate)")
2325

@@ -27,7 +29,7 @@ extension Gen {
2729

2830
return Generator(
2931
run: { [total] rng in
30-
let pick = Float.random(in: 0..<total, using: &rng)
32+
let pick = FloatLiteralType.random(in: 0..<total, using: &rng)
3133
let index = options.firstIndex { $0.limit > pick }! as Int
3234

3335
return (index: index, value: options[index].gen._runIntermediate(&rng))
@@ -45,10 +47,11 @@ extension Gen {
4547
}
4648

4749
#if swift(>=6.2)
50+
@_disfavoredOverload
4851
public static func oneOf<each Seq: Sequence>(_ generators: repeat Generator<Value, each Seq>)
4952
-> Generator<Value, AnySequence<(index: Int, value: Any)>>
5053
{
51-
var gens: [(rate: Float, gen: Generator<Value, AnySequence<Any>>)] = []
54+
var gens: [(rate: FloatLiteralType, gen: Generator<Value, AnySequence<Any>>)] = []
5255

5356
for gen in repeat each generators {
5457
gens.append((rate: 1.0, gen.eraseToAny()))
@@ -57,12 +60,13 @@ extension Gen {
5760
return frequency(gens)
5861
}
5962

63+
@_disfavoredOverload
6064
public static func frequency<each Seq: Sequence>(
61-
_ generators: repeat (rate: Float, gen: Generator<Value, each Seq>)
65+
_ generators: repeat (rate: FloatLiteralType, gen: Generator<Value, each Seq>)
6266
)
6367
-> Generator<Value, AnySequence<(index: Int, value: Any)>>
6468
{
65-
var gens: [(rate: Float, gen: Generator<Value, AnySequence<Any>>)] = []
69+
var gens: [(rate: FloatLiteralType, gen: Generator<Value, AnySequence<Any>>)] = []
6670

6771
for (rate, gen) in repeat each generators {
6872
gens.append((rate: rate, gen.eraseToAny()))

Tests/PropertyBasedTests/GenTests+Frequency.swift

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
// Created by Lennard Sprong on 08/07/2025.
66
//
77

8-
#if compiler(>=6.2)
98
import 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

Comments
 (0)