aboutsummaryrefslogtreecommitdiff
path: root/tests/test/c-parse.scm
blob: 22aaf92acc717f8b381d450e5a55a91a79e55953 (plain)
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
;;; Commentary
;; Test implementation details of C parser
;; TODO Should be ran before (test cpp)
;;; Code

(define-module (test cpp)
  :use-module (srfi srfi-64)
  :use-module (srfi srfi-88)
  :use-module ((c old lex) :select (lex))
  :use-module (c old parse))

(define flatten-infix (@@ (c old parse) flatten-infix))
(define resolve-order-of-operations (@@ (c old parse) resolve-order-of-operations))

(test-group "Flatten infix"
 (test-equal "Simple binary operator"
   '(fixed-infix (integer (base-10 "1"))
                 +
                 (integer (base-10 "2")))
   (flatten-infix (lex "1 + 2")))

 (test-equal "Simple binary operator, with compound structure in on branch"
   '(fixed-infix (integer (base-10 "1"))
                 +
                 (funcall (variable "f")
                          (group (integer (base-10 "2")))))
   (flatten-infix (lex "1 + f(2)"))))

(test-group "Order of operations"
  (test-equal "Basic binary operator"
    '((resolved-operator +)
      (integer (base-10 "1"))
      (integer (base-10 "2")))
    (resolve-order-of-operations (flatten-infix (lex "1 + 2"))))

  (test-equal "Multiple operators, with non-left-associative application"
    '((resolved-operator +)
      (integer (base-10 "1"))
      ((resolved-operator *)
       (integer (base-10 "2"))
       (integer (base-10 "3"))))
    (resolve-order-of-operations (flatten-infix (lex "1 + 2 * 3"))))

  (test-equal "Multiple of the same operation gets clumed together"
    '((resolved-operator +)
      (integer (base-10 "1"))
      (integer (base-10 "2"))
      (integer (base-10 "3")))
    (resolve-order-of-operations (flatten-infix (lex "1 + 2 + 3"))))

  (test-equal "Simple Ternary"
    '(ternary
      (integer (base-10 "1"))
      (integer (base-10 "2"))
      (integer (base-10 "3")))
    (resolve-order-of-operations (flatten-infix (lex "1 ? 2 : 3"))))

  (test-equal "ternary with further infix operators"
    '(ternary ((resolved-operator +)
               (integer (base-10 "1"))
               (integer (base-10 "2")))
              ((resolved-operator %)
               (integer (base-10 "3"))
               (integer (base-10 "4")))
              ((resolved-operator *)
               (integer (base-10 "5"))
               (integer (base-10 "6"))))
    (resolve-order-of-operations (flatten-infix (lex "1 + 2? 3 % 4 : 5 * 6")))))