|
20 | 20 | ;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21 | 21 | ;; THE SOFTWARE.
|
22 | 22 |
|
| 23 | +(require archimedes) |
| 24 | + |
23 | 25 | (import [pyherc.solver [Variable are-equal! are-inequal! less-than!
|
24 | 26 | greater-than! in-between! solve solve-one value]]
|
25 | 27 | [hamcrest [assert-that is- equal-to is-not :as is-not- less-than
|
26 | 28 | greater-than]])
|
27 | 29 |
|
| 30 | +(defmacro non-fact [&rest code] |
| 31 | + `"non-fact") |
| 32 | + |
28 | 33 | (defn context []
|
29 | 34 | "create an empty context for testing"
|
30 | 35 | {:frame-pointer 0
|
31 | 36 | :variable-stack []
|
32 | 37 | :value-stack []
|
33 | 38 | :solved false})
|
34 | 39 |
|
35 |
| -(defn test-simple-equality [] |
36 |
| - "simple equality test" |
37 |
| - (let [[var₁ (Variable 1 2 3)] |
38 |
| - [var₂ (Variable 3 4 5)]] |
39 |
| - (are-equal! var₁ var₂) |
40 |
| - (solve var₁ var₂) |
41 |
| - (assert-that (value var₁) (is- (equal-to (value var₂)))))) |
| 40 | +(fact "two variables declared equal will have same value" |
| 41 | + (let [[var₁ (Variable 1 2 3)] |
| 42 | + [var₂ (Variable 3 4 5)]] |
| 43 | + (are-equal! var₁ var₂) |
| 44 | + (solve var₁ var₂) |
| 45 | + (assert-that (value var₁) (is- (equal-to (value var₂)))))) |
42 | 46 |
|
43 |
| -(defn test-simple-inequality [] |
44 |
| - "inequal variables have different values" |
45 |
| - (let [[var₁ (Variable 1 2 3)] |
46 |
| - [var₂ (Variable 1 2 3)]] |
47 |
| - (are-inequal! var₁ var₂) |
48 |
| - (solve var₁ var₂) |
49 |
| - (assert-that (value var₁) (is-not- (equal-to (value var₂)))))) |
| 47 | +(fact "two variables declared inequal will have different value" |
| 48 | + (let [[var₁ (Variable 1 2 3)] |
| 49 | + [var₂ (Variable 1 2 3)]] |
| 50 | + (are-inequal! var₁ var₂) |
| 51 | + (solve var₁ var₂) |
| 52 | + (assert-that (value var₁) (is-not- (equal-to (value var₂)))))) |
50 | 53 |
|
51 |
| -(defn test-less-than-constraint [] |
52 |
| - "variable can be constrained to be less than something else" |
53 |
| - (let [[var₁ (Variable 1 2 3 4 5)] |
54 |
| - [var₂ (Variable 1 2 3 4 5)]] |
55 |
| - (less-than! var₁ var₂) |
56 |
| - (solve var₁ var₂) |
57 |
| - (assert-that (value var₁) (is- (less-than (value var₂)))))) |
| 54 | +(fact "variable can be constrained to be less than something else" |
| 55 | + (let [[var₁ (Variable 1 2 3 4 5)] |
| 56 | + [var₂ (Variable 1 2 3 4 5)]] |
| 57 | + (less-than! var₁ var₂) |
| 58 | + (solve var₁ var₂) |
| 59 | + (assert-that (value var₁) (is- (less-than (value var₂)))))) |
58 | 60 |
|
59 |
| -(defn test-triple-less-than [] |
60 |
| - "set of variables can be ordered with less-than!" |
61 |
| - (let [[var₁ (Variable 1 2 3 4 5)] |
62 |
| - [var₂ (Variable 1 2 3 4 5)] |
63 |
| - [var₃ (Variable 1 2 3 4 5)]] |
64 |
| - (less-than! var₁ var₂) |
65 |
| - (less-than! var₂ var₃) |
66 |
| - (solve var₁ var₂ var₃) |
67 |
| - (assert-that (value var₁) (is- (less-than (value var₂)))) |
68 |
| - (assert-that (value var₂) (is- (less-than (value var₃)))))) |
| 61 | +(fact "set of variables can be ordered with less-than!" |
| 62 | + (let [[var₁ (Variable 1 2 3 4 5)] |
| 63 | + [var₂ (Variable 1 2 3 4 5)] |
| 64 | + [var₃ (Variable 1 2 3 4 5)]] |
| 65 | + (less-than! var₁ var₂) |
| 66 | + (less-than! var₂ var₃) |
| 67 | + (solve var₁ var₂ var₃) |
| 68 | + (assert-that (value var₁) (is- (less-than (value var₂)))) |
| 69 | + (assert-that (value var₂) (is- (less-than (value var₃)))))) |
69 | 70 |
|
70 |
| -(defn test-basic-greater-than [] |
71 |
| - "variable can be constrained to be greater than something else" |
72 |
| - (let [[var₁ (Variable 1 2 3 4 5)] |
73 |
| - [var₂ (Variable 1 2 3 4 5)]] |
74 |
| - (greater-than! var₁ var₂) |
75 |
| - (solve var₁ var₂) |
76 |
| - (assert-that (value var₁) (is- (greater-than (value var₂)))))) |
| 71 | +(fact "variable can be constrained to be greater than something else" |
| 72 | + (let [[var₁ (Variable 1 2 3 4 5)] |
| 73 | + [var₂ (Variable 1 2 3 4 5)]] |
| 74 | + (greater-than! var₁ var₂) |
| 75 | + (solve var₁ var₂) |
| 76 | + (assert-that (value var₁) (is- (greater-than (value var₂)))))) |
77 | 77 |
|
78 |
| -(defn test-basic-in-between [] |
79 |
| - "variable can be constrained to be in-between two variables" |
80 |
| - (let [[var₁ (Variable 1 2 3 4 5)] |
81 |
| - [var₂ (Variable 1 2 3 4 5)] |
82 |
| - [var₃ (Variable 1 2 3 4 5)]] |
83 |
| - (in-between! var₁ var₂ var₃) |
84 |
| - (solve var₁ var₂ var₃) |
85 |
| - (assert-that (value var₁) (is- (greater-than (value var₂)))) |
86 |
| - (assert-that (value var₁) (is- (less-than (value var₃)))))) |
| 78 | +(fact "variable can be constrained to be in-between two variables" |
| 79 | + (let [[var₁ (Variable 1 2 3 4 5)] |
| 80 | + [var₂ (Variable 1 2 3 4 5)] |
| 81 | + [var₃ (Variable 1 2 3 4 5)]] |
| 82 | + (in-between! var₁ var₂ var₃) |
| 83 | + (solve var₁ var₂ var₃) |
| 84 | + (assert-that (value var₁) (is- (greater-than (value var₂)))) |
| 85 | + (assert-that (value var₁) (is- (less-than (value var₃)))))) |
87 | 86 |
|
88 |
| -(defn test-multiple-constraints [] |
89 |
| - "variables with multiple constraints can be solved" |
90 |
| - (let [[var₁ (Variable 1 2 3 4 5)] |
91 |
| - [var₂ (Variable 1 2 3 4 5)] |
92 |
| - [var₃ (Variable 1 2 3 4 5)]] |
93 |
| - (are-equal! var₁ var₂) |
94 |
| - (are-inequal! var₁ var₃) |
95 |
| - (solve var₁ var₂ var₃) |
96 |
| - (assert-that (value var₁) (is- (equal-to (value var₂)))) |
97 |
| - (assert-that (value var₁) (is-not- (equal-to (value var₃)))))) |
| 87 | +(fact "variables with multiple constraints can be solved" |
| 88 | + (let [[var₁ (Variable 1 2 3 4 5)] |
| 89 | + [var₂ (Variable 1 2 3 4 5)] |
| 90 | + [var₃ (Variable 1 2 3 4 5)]] |
| 91 | + (are-equal! var₁ var₂) |
| 92 | + (are-inequal! var₁ var₃) |
| 93 | + (solve var₁ var₂ var₃) |
| 94 | + (assert-that (value var₁) (is- (equal-to (value var₂)))) |
| 95 | + (assert-that (value var₁) (is-not- (equal-to (value var₃)))))) |
98 | 96 |
|
99 |
| -(defn test-single-value-left [] |
100 |
| - "when variables have single value left, they are reported" |
101 |
| - (let [[var₁ (Variable 1)] |
102 |
| - [var₂ (Variable 2)]] |
103 |
| - (solve var₁ var₂) |
104 |
| - (assert-that (value var₁) (is- (equal-to 1))) |
105 |
| - (assert-that (value var₂) (is- (equal-to 2))))) |
| 97 | +(fact "matrix of four variables requiring backtracking can be solved" |
| 98 | + (let [[var₁ (Variable 1 2 3 4)] |
| 99 | + [var₂ (Variable 1 2 3 4)] |
| 100 | + [var₃ (Variable 1 2 3 4)]] |
| 101 | + (are-inequal! var₁ var₂) |
| 102 | + (are-inequal! var₁ var₃) |
| 103 | + (are-inequal! var₂ var₃) |
| 104 | + (solve var₁ var₂ var₃) |
| 105 | + (assert-that (value var₁) (is-not- (equal-to (value var₂)))) |
| 106 | + (assert-that (value var₁) (is-not- (equal-to (value var₃)))) |
| 107 | + (assert-that (value var₂) (is-not- (equal-to (value var₃)))))) |
0 commit comments