/
ChurchArithmeticTest.kt
119 lines (104 loc) 路 2.21 KB
/
ChurchArithmeticTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package ai.hypergraph.kotlingrad.typelevel.church
import kotlin.test.*
/*
./gradlew :kotlingrad:jvmTest --tests "ai.hypergraph.kotlingrad.typelevel.church.ChurchArithmeticTest"
*/
class ChurchArithmeticTest {
@Test
fun shouldBeFour() {
val four = S2 + S2
assertEquals(4, four.toInt())
}
@Test
fun shouldBeNine() {
var nine = S3 * S3
assertEquals(9, nine.toInt())
nine = S4 + S4 + S1
assertEquals(9, nine.toInt())
}
@Test
fun shouldBeTwo() {
val two = S1
.plus1()
.plus1()
.plus1()
.plus1()
.plus1()
.plus1()
.plus1()
.minus2()
.minus2()
.minus2()
.minus2()
.plus2()
assertEquals(2, two.toInt())
}
fun takes5(five: Q2<L3>): S<S<S<S<O>>>> = five - S1
fun takes6(six: S<L5>): S<S<S<S<S<O>>>>> = six - S1
@Test
fun testComposition() {
val four = takes5(takes6(S2 * S3))
assertEquals(4, four.toInt())
}
@Test
fun testLiteral() {
assertEquals(4, S4.toInt())
assertEquals(4, S(S(S(S(O)))).toInt())
}
@Test
fun shouldBeThree() {
val three = S2 * S2 * S2 / S4 + S2 - S1
assertEquals(3, three.toInt())
}
@Test
fun shouldBeFive() {
val five = O
.plus2()
.let { it + S3 }
.plus4()
.minus3()
.minus3()
.let { it + it }
.minus3()
.let { it * S2 }
.minus4()
.let { it * it }
.let { it - S2 }
.let { it + S3 }
.minus2()
.minus1()
.let { it * it }
.let { it / S2 }
.let { it + S3 }
.let { it + S3 }
.let { it + S3 }
.let { it + S3 }
.let { it + S3 }
.let { it - S3 }
.let { it - S2 }
.let { it - S2 }
.let { it - S2 }
.let { it - S2 }
.let { it - S1 }
takes5(five)
assertEquals(5, five.toInt())
}
// @Test
// fun shouldBeThirteen() {
// val thirteen = S2
// .let { it + S4 }
// .let { it + S4 }
// .let { it + S4 }
// .let { it + S4 }
// .let { it + S4 }
// .let { it + S4 }
// .let { it + S4 }
// .let { it - S3 }
// .let { it - S3 }
// .let { it - S3 }
// .let { it - S3 }
// .let { it - S3 }
//
// assertEquals(13, thirteen.toInt())
// }
}