~subsetpark/ec

ref: a37c903188ba035322c030f56c766089eab36556 ec/test/calc.janet -rw-r--r-- 2.7 KiB
a37c9031 — Zach Smith Bugfix: make-element in vector math as well 11 months ago
                                                                                
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
(import /src/calc)

(import /src/operations :prefix "o/")
(import /src/adverbs :prefix "a/")

(use testament)
(use /test-support)

(deftest vectors
  (def v (wrap 1 2 3))
  (def v2 (wrap 2 5 10))

  (vec= [4 5 6] (calc/apply-operation o/add v (:new calc/Int 3)))
  (vec= [3 7 13] (calc/apply-operation o/add v v2))

  (vec= [-2 -1 0] (calc/apply-operation o/sub v (:new calc/Int 3)))
  (vec= [2 1 0] (calc/apply-operation o/sub (:new calc/Int 3) v))

  (is (vec= 6 (calc/apply-operation o/add (:new calc/Int 3) (:new calc/Int 3)))))

(deftest matrices
  (is (thrown? (wrap (wrap 1) (wrap 1 2)))
      "Inner vectors are of differing sizes")

  (def m (wrap (wrap 1 2 3)
               (wrap 4 5 6)))
  (is (= [2 3] (calc/get-shape m)))

  (def filled (calc/fill m [2 2 3]))
  (is (= [2 2 3] (calc/get-shape filled)))

  (vec= @[@[@[1 2 3]
            @[4 5 6]]
          @[@[1 2 3]
            @[4 5 6]]]
        filled)

  (is (thrown? (calc/fill m [2 3 3]))
      "Vectors can be filled into shapes that share a suffix")

  (vec= @[@[@[2 4 6]
            @[8 10 12]]
          @[@[2 4 6]
            @[8 10 12]]]
        (calc/apply-operation o/add m filled)))

(deftest distribute-dyad-add
  (def s (:new calc/Stack))
  # Initial value
  (calc/push s (:new calc/Int 0))
  # Operands
  (calc/push s (wrap 1 2 3))
  # Operator
  (calc/push s (wrap o/add))
  (calc/push s a/distribute-dyad)
  (pop-and-compare 6 s))

(deftest distribute-dyad-multiple-operations
  (def s (:new calc/Stack))
  (calc/push s (:new calc/Int 0))
  (calc/push s (wrap 1 2 3))
  (calc/push s (wrap 3 o/mul o/add))
  (calc/push s a/distribute-dyad)
  (pop-and-compare 18 s))

(deftest apply-vector
  (def s (:new calc/Stack))
  (calc/push s (wrap 1 2 3))
  (calc/push s a/apply-vector)
  (pop-and-compare 3 s)
  (pop-and-compare 2 s)
  (pop-and-compare 1 s)
  (is (empty? (s :data))))

(deftest apply-operation
  (def s (:new calc/Stack))
  (calc/push s (:new calc/Int 3))
  (calc/push s (:new calc/Int 5))
  (calc/push s (wrap o/add))
  (calc/push s a/apply-vector)
  (pop-and-compare 8 s)
  (is (empty? (s :data))))

(deftest wrap-stack
  (def s (:new calc/Stack))
  (calc/push s (:new calc/Int 3))
  (calc/push s (:new calc/Int 4))
  (calc/push s a/wrap-stack)

  (def vec (calc/pop s))
  (is (= [2] (calc/shape vec)))
  (is (empty? (s :data))))

(deftest wrap-vectors
  (def s (:new calc/Stack))
  (calc/push s (wrap 1 2))
  (calc/push s (wrap 2 4))
  (calc/push s a/wrap-stack)

  (def vec (calc/pop s))
  (is (= [2 2] (calc/shape vec)))
  (is (empty? (s :data))))

(deftest wrap-failure
  (def s (:new calc/Stack))
  (calc/push s (wrap 1))
  (calc/push s (wrap 2 4))
  (is (thrown?
        (calc/push s a/wrap-stack))
      "Wrapping a stack requires homogeneous data"))

(run-tests!)