summaryrefslogtreecommitdiff
path: root/factors/factors_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'factors/factors_test.go')
-rw-r--r--factors/factors_test.go101
1 files changed, 77 insertions, 24 deletions
diff --git a/factors/factors_test.go b/factors/factors_test.go
index a2e81cd..ceaf4d1 100644
--- a/factors/factors_test.go
+++ b/factors/factors_test.go
@@ -2,20 +2,21 @@ package factors
import (
"fmt"
+ "math"
"testing"
)
var primeFactorCases = map[uint]PrimeFactorization{
- 0: PrimeFactorization{map[uint]uint{0: 1}},
- 1: PrimeFactorization{map[uint]uint{}},
- 2: PrimeFactorization{map[uint]uint{2: 1}},
- 3: PrimeFactorization{map[uint]uint{3: 1}},
- 4: PrimeFactorization{map[uint]uint{2: 2}},
- 6: PrimeFactorization{map[uint]uint{2: 1, 3: 1}},
- 10: PrimeFactorization{map[uint]uint{2: 1, 5: 1}},
- 12: PrimeFactorization{map[uint]uint{2: 2, 3: 1}},
- 33: PrimeFactorization{map[uint]uint{3: 1, 11: 1}},
- 60: PrimeFactorization{map[uint]uint{2: 2, 3: 1, 5: 1}},
+ 0: PrimeFactorization{map[uint]uint{0: 1}},
+ 1: PrimeFactorization{map[uint]uint{}},
+ 2: PrimeFactorization{map[uint]uint{2: 1}},
+ 3: PrimeFactorization{map[uint]uint{3: 1}},
+ 4: PrimeFactorization{map[uint]uint{2: 2}},
+ 6: PrimeFactorization{map[uint]uint{2: 1, 3: 1}},
+ 10: PrimeFactorization{map[uint]uint{2: 1, 5: 1}},
+ 12: PrimeFactorization{map[uint]uint{2: 2, 3: 1}},
+ 33: PrimeFactorization{map[uint]uint{3: 1, 11: 1}},
+ 60: PrimeFactorization{map[uint]uint{2: 2, 3: 1, 5: 1}},
86400: PrimeFactorization{map[uint]uint{2: 7, 3: 3, 5: 2}},
}
@@ -32,10 +33,10 @@ func TestPrimeFactorize(t *testing.T) {
}
var factorCases = map[uint][]uint{
- 1: []uint{1},
- 2: []uint{1, 2},
- 4: []uint{1, 2, 4},
- 6: []uint{1, 2, 3, 6},
+ 1: []uint{1},
+ 2: []uint{1, 2},
+ 4: []uint{1, 2, 4},
+ 6: []uint{1, 2, 3, 6},
10: []uint{1, 2, 5, 10},
12: []uint{1, 2, 3, 4, 6, 12},
13: []uint{1, 13},
@@ -56,18 +57,52 @@ func TestFactors(t *testing.T) {
}
}
-func setEquals(a, b []uint) bool {
- // use maps to simulate sets
- // aSet[a] == true means set contains a, false means not
- aSet := make(map[uint]bool)
- bSet := make(map[uint]bool)
- for _, i := range a {
- aSet[i] = true
+var totativeRatioCases = map[uint]float64{
+ 1: 1.0,
+ 2: 0.5,
+ 3: 2.0 / 3.0,
+ 4: 0.5,
+ 6: 1.0 / 3.0,
+ 8: 0.5,
+ 12: 1.0 / 3.0,
+}
+
+func TestTotativeRatio(t *testing.T) {
+ for i, expected := range totativeRatioCases {
+ testname := fmt.Sprintf("%d", i)
+ t.Run(testname, func(t *testing.T) {
+ actual := TotativeRatio(i)
+ if !floatEquals(expected, actual, 1e-15) {
+ t.Errorf("TotativeRatio(%d) = %v, want %v", i, actual, expected)
+ }
+ })
}
- for _, j := range b {
- bSet[j] = true
+}
+
+var factorScoreCases = map[uint]float64{
+ 1: 1.0,
+ 2: 1.5,
+ 3: 4.0 / 3.0,
+ 4: 1.75,
+ 6: 2.0,
+ 8: 1.875,
+ 10: 1.8,
+ 12: 7.0 / 3.0,
+ 120: 3.0,
+}
+
+func TestFactorScore(t *testing.T) {
+ for i, expected := range factorScoreCases {
+ testname := fmt.Sprintf("%d", i)
+ t.Run(testname, func(t *testing.T) {
+ actual := Score(i)
+ // factors.Score is accurate enough that we can test
+ // for exact float values!
+ if expected != actual {
+ t.Errorf("Score(%d) = %v, want %v", i, actual, expected)
+ }
+ })
}
- return mapEquals(aSet, bSet)
}
func mapEquals[K comparable, V comparable](a, b map[K]V) bool {
@@ -83,3 +118,21 @@ func mapEquals[K comparable, V comparable](a, b map[K]V) bool {
}
return true
}
+
+func setEquals(a, b []uint) bool {
+ // use maps to simulate sets
+ // aSet[a] == true means set contains a, false means not
+ aSet := make(map[uint]bool)
+ bSet := make(map[uint]bool)
+ for _, i := range a {
+ aSet[i] = true
+ }
+ for _, j := range b {
+ bSet[j] = true
+ }
+ return mapEquals(aSet, bSet)
+}
+
+func floatEquals(a, b, maxDelta float64) bool {
+ return math.Abs(a-b) <= maxDelta*math.Max(math.Abs(a), math.Abs(b))
+}