diff options
Diffstat (limited to '')
| -rw-r--r-- | new-luxc/test/test/luxc/analyser/common.lux | 53 | ||||
| -rw-r--r-- | new-luxc/test/test/luxc/analyser/lux.lux | 173 | ||||
| -rw-r--r-- | new-luxc/test/test/luxc/analyser/primitive.lux | 61 | ||||
| -rw-r--r-- | new-luxc/test/test/luxc/analyser/reference.lux | 49 | ||||
| -rw-r--r-- | new-luxc/test/test/luxc/analyser/struct.lux | 39 | ||||
| -rw-r--r-- | new-luxc/test/tests.lux | 4 | 
6 files changed, 205 insertions, 174 deletions
| diff --git a/new-luxc/test/test/luxc/analyser/common.lux b/new-luxc/test/test/luxc/analyser/common.lux new file mode 100644 index 000000000..9e3db3513 --- /dev/null +++ b/new-luxc/test/test/luxc/analyser/common.lux @@ -0,0 +1,53 @@ +(;module: +  lux +  (lux ["R" math/random "R/" Monad<Random>] +       (macro [code]))) + +(def: compiler-version Text "0.6.0") + +(def: init-compiler-info +  Compiler-Info +  {#;compiler-version compiler-version +   #;compiler-mode    #;Build}) + +(def: init-type-context +  Type-Context +  {#;ex-counter +0 +   #;var-counter +0 +   #;var-bindings (list)}) + +(def: #export init-compiler +  Compiler +  {#;info            init-compiler-info +   #;source          [dummy-cursor ""] +   #;cursor          dummy-cursor +   #;modules         (list) +   #;scopes          (list) +   #;type-context    init-type-context +   #;expected        #;None +   #;seed            +0 +   #;scope-type-vars (list) +   #;host            (:! Void [])}) + +(def: gen-unit +  (R;Random Code) +  (R/wrap (' []))) + +(def: #export gen-simple-primitive +  (R;Random [Type Code]) +  (with-expansions +    [<generators> (do-template [<type> <code-wrapper> <value-gen>] +                    [(R;seq (R/wrap <type>) (R/map <code-wrapper> <value-gen>))] + +                    [Unit code;tuple (R;list +0 gen-unit)] +                    [Bool code;bool  R;bool] +                    [Nat  code;nat   R;nat] +                    [Int  code;int   R;int] +                    [Deg  code;deg   R;deg] +                    [Real code;real  R;real] +                    [Char code;char  R;char] +                    [Text code;text  (R;text +5)] +                    )] +    ($_ R;either +        <generators> +        ))) diff --git a/new-luxc/test/test/luxc/analyser/lux.lux b/new-luxc/test/test/luxc/analyser/lux.lux deleted file mode 100644 index beb26513c..000000000 --- a/new-luxc/test/test/luxc/analyser/lux.lux +++ /dev/null @@ -1,173 +0,0 @@ -(;module: -  lux -  (lux [io] -       (control monad -                pipe) -       (data [bool "B/" Eq<Bool>] -             [char "C/" Eq<Char>] -             [text "T/" Eq<Text>] -             (text format -                   ["l" lexer]) -             [number] -             ["E" error] -             [product] -             (coll [list "L/" Functor<List> Fold<List>])) -       ["R" math/random "R/" Monad<Random>] -       [type "Type/" Eq<Type>] -       [macro #+ Monad<Lux>] -       (macro [code]) -       test) -  (luxc ["&" base] -        ["&;" env] -        ["&;" module] -        (lang ["~" analysis]) -        [analyser] -        (analyser ["@" lux] -                  ["@;" common]))) - -(def: init-cursor Cursor ["" +0 +0]) - -(def: compiler-version Text "0.6.0") - -(def: init-compiler-info -  Compiler-Info -  {#;compiler-version compiler-version -   #;compiler-mode    #;Build}) - -(def: init-type-context -  Type-Context -  {#;ex-counter +0 -   #;var-counter +0 -   #;var-bindings (list)}) - -(def: init-compiler -  Compiler -  {#;info            init-compiler-info -   #;source          [init-cursor ""] -   #;cursor          init-cursor -   #;modules         (list) -   #;scopes          (list) -   #;type-context    init-type-context -   #;expected        #;None -   #;seed            +0 -   #;scope-type-vars (list) -   #;host            (:! Void [])}) - -(test: "Simple primitives" -  [%bool% R;bool -   %nat% R;nat -   %int% R;int -   %deg% R;deg -   %real% R;real -   %char% R;char -   %text% (R;text +5)] -  (with-expansions -    [<primitives> (do-template [<desc> <type> <tag> <value> <analyser>] -                    [(assert (format "Can analyse " <desc> ".") -                             (|> (@common;with-unknown-type -                                   (<analyser> init-cursor <value>)) -                                 (macro;run init-compiler) -                                 (case> (#E;Success [[_type _cursor] (<tag> value)]) -                                        (and (Type/= <type> _type) -                                             (is <value> value)) - -                                        _ -                                        false)) -                             )] - -                    ["unit" Unit #~;Unit []     (function [cursor value] (@;analyse-unit cursor))] -                    ["bool" Bool #~;Bool %bool% @;analyse-bool] -                    ["nat"  Nat  #~;Nat  %nat%  @;analyse-nat] -                    ["int"  Int  #~;Int  %int%  @;analyse-int] -                    ["deg"  Deg  #~;Deg  %deg%  @;analyse-deg] -                    ["real" Real #~;Real %real% @;analyse-real] -                    ["char" Char #~;Char %char% @;analyse-char] -                    ["text" Text #~;Text %text% @;analyse-text] -                    )] -    ($_ seq -        <primitives>))) - -(def: gen-unit -  (R;Random Code) -  (R/wrap (' []))) - -(def: gen-simple-primitive -  (R;Random [Type Code]) -  (with-expansions -    [<generators> (do-template [<type> <code-wrapper> <value-gen>] -                    [(R;seq (R/wrap <type>) (R/map <code-wrapper> <value-gen>))] - -                    [Unit code;tuple (R;list +0 gen-unit)] -                    [Bool code;bool  R;bool] -                    [Nat  code;nat   R;nat] -                    [Int  code;int   R;int] -                    [Deg  code;deg   R;deg] -                    [Real code;real  R;real] -                    [Char code;char  R;char] -                    [Text code;text  (R;text +5)] -                    )] -    ($_ R;either -        <generators> -        ))) - -(test: "Tuples" -  [size (|> R;nat (:: @ map (|>. (n.% +10) (n.max +2)))) -   primitives (R;list size gen-simple-primitive)] -  ($_ seq -      (let [tuple-type (type;tuple (L/map product;left primitives))] -        (assert "Can analyse tuple." -                (|> (@common;with-unknown-type -                      (@;analyse-tuple (analyser;analyse (:!! [])) -                                       init-cursor -                                       (L/map product;right primitives))) -                    (macro;run init-compiler) -                    (case> (#E;Success [[_type _cursor] (#~;Tuple elems)]) -                           (and (Type/= tuple-type _type) -                                (n.= size (list;size elems)) -                                (L/fold (function [[pt at] so-far] -                                          (and so-far (Type/= pt at))) -                                        true -                                        (list;zip2 (L/map product;left primitives) -                                                   (L/map ~;get-type elems)))) - -                           _ -                           false)) -                )))) - -(test: "References" -  [[ref-type _] gen-simple-primitive -   module-name (R;text +5) -   scope-name (R;text +5) -   var-name (R;text +5)] -  ($_ seq -      (assert "Can analyse relative reference." -              (|> (&env;with-scope scope-name -                    (&env;with-local [var-name ref-type] -                      (@common;with-unknown-type -                        (@;analyse-reference init-cursor ["" var-name])))) -                  (macro;run init-compiler) -                  (case> (#E;Success [[_type _cursor] (#~;Relative idx)]) -                         (Type/= ref-type _type) - -                         (#E;Error error) -                         false -                          -                         _ -                         false))) -      (assert "Can analyse absolute reference." -              (|> (do Monad<Lux> -                    [_ (&module;create +0 module-name) -                     _ (&module;define [module-name var-name] -                                       [ref-type (list) (:! Void [])])] -                    (@common;with-unknown-type -                      (@;analyse-reference init-cursor [module-name var-name]))) -                  (macro;run init-compiler) -                  (case> (#E;Success [[_type _cursor] (#~;Absolute idx)]) -                         (Type/= ref-type _type) - -                         (#E;Error error) -                         false -                          -                         _ -                         false))) -      )) diff --git a/new-luxc/test/test/luxc/analyser/primitive.lux b/new-luxc/test/test/luxc/analyser/primitive.lux new file mode 100644 index 000000000..321a51fcb --- /dev/null +++ b/new-luxc/test/test/luxc/analyser/primitive.lux @@ -0,0 +1,61 @@ +(;module: +  lux +  (lux [io] +       (control monad +                pipe) +       (data [bool "B/" Eq<Bool>] +             [char "C/" Eq<Char>] +             [text "T/" Eq<Text>] +             (text format +                   ["l" lexer]) +             [number] +             ["E" error] +             [product] +             (coll [list "L/" Functor<List> Fold<List>])) +       ["R" math/random "R/" Monad<Random>] +       [type "Type/" Eq<Type>] +       [macro #+ Monad<Lux>] +       (macro [code]) +       test) +  (luxc ["&" base] +        ["&;" env] +        ["&;" module] +        (lang ["~" analysis]) +        [analyser] +        (analyser ["@" primitive] +                  ["@;" common])) +  (.. common)) + +(test: "Simple primitives" +  [%bool% R;bool +   %nat% R;nat +   %int% R;int +   %deg% R;deg +   %real% R;real +   %char% R;char +   %text% (R;text +5)] +  (with-expansions +    [<primitives> (do-template [<desc> <type> <tag> <value> <analyser>] +                    [(assert (format "Can analyse " <desc> ".") +                             (|> (@common;with-unknown-type +                                   (<analyser> <value>)) +                                 (macro;run init-compiler) +                                 (case> (#E;Success [_type (<tag> value)]) +                                        (and (Type/= <type> _type) +                                             (is <value> value)) + +                                        _ +                                        false)) +                             )] + +                    ["unit" Unit #~;Unit []     (function [value] @;analyse-unit)] +                    ["bool" Bool #~;Bool %bool% @;analyse-bool] +                    ["nat"  Nat  #~;Nat  %nat%  @;analyse-nat] +                    ["int"  Int  #~;Int  %int%  @;analyse-int] +                    ["deg"  Deg  #~;Deg  %deg%  @;analyse-deg] +                    ["real" Real #~;Real %real% @;analyse-real] +                    ["char" Char #~;Char %char% @;analyse-char] +                    ["text" Text #~;Text %text% @;analyse-text] +                    )] +    ($_ seq +        <primitives>))) diff --git a/new-luxc/test/test/luxc/analyser/reference.lux b/new-luxc/test/test/luxc/analyser/reference.lux new file mode 100644 index 000000000..4e83a7af8 --- /dev/null +++ b/new-luxc/test/test/luxc/analyser/reference.lux @@ -0,0 +1,49 @@ +(;module: +  lux +  (lux [io] +       (control monad +                pipe) +       (data ["E" error]) +       ["R" math/random "R/" Monad<Random>] +       [type "Type/" Eq<Type>] +       [macro #+ Monad<Lux>] +       test) +  (luxc ["&;" env] +        ["&;" module] +        (lang ["~" analysis]) +        [analyser] +        (analyser ["@" reference] +                  ["@;" common])) +  (.. common)) + +(test: "References" +  [[ref-type _] gen-simple-primitive +   module-name (R;text +5) +   scope-name (R;text +5) +   var-name (R;text +5)] +  ($_ seq +      (assert "Can analyse relative reference." +              (|> (&env;with-scope scope-name +                    (&env;with-local [var-name ref-type] +                      (@common;with-unknown-type +                        (@;analyse-reference ["" var-name])))) +                  (macro;run init-compiler) +                  (case> (#E;Success [_type (#~;Relative idx)]) +                         (Type/= ref-type _type) + +                         _ +                         false))) +      (assert "Can analyse absolute reference." +              (|> (do Monad<Lux> +                    [_ (&module;create +0 module-name) +                     _ (&module;define [module-name var-name] +                                       [ref-type (list) (:! Void [])])] +                    (@common;with-unknown-type +                      (@;analyse-reference [module-name var-name]))) +                  (macro;run init-compiler) +                  (case> (#E;Success [_type (#~;Absolute idx)]) +                         (Type/= ref-type _type) + +                         _ +                         false))) +      )) diff --git a/new-luxc/test/test/luxc/analyser/struct.lux b/new-luxc/test/test/luxc/analyser/struct.lux new file mode 100644 index 000000000..a86f6da9c --- /dev/null +++ b/new-luxc/test/test/luxc/analyser/struct.lux @@ -0,0 +1,39 @@ +(;module: +  lux +  (lux [io] +       (control monad +                pipe) +       (data ["E" error] +             [product] +             (coll [list "L/" Functor<List>])) +       ["R" math/random "R/" Monad<Random>] +       [type "Type/" Eq<Type>] +       [macro #+ Monad<Lux>] +       test) +  (luxc ["&" base] +        (lang ["~" analysis]) +        [analyser] +        (analyser ["@" struct] +                  ["@;" common])) +  (.. common)) + +(def: analyse +  &;Analyser +  (analyser;analyser (:!! []))) + +(test: "Tuples" +  [size (|> R;nat (:: @ map (|>. (n.% +10) (n.max +2)))) +   primitives (R;list size gen-simple-primitive)] +  ($_ seq +      (assert "Can analyse tuple." +              (|> (@common;with-unknown-type +                    (@;analyse-tuple analyse (L/map product;right primitives))) +                  (macro;run init-compiler) +                  (case> (#E;Success [_type (#~;Tuple elems)]) +                         (and (Type/= (type;tuple (L/map product;left primitives)) +                                      _type) +                              (n.= size (list;size elems))) + +                         _ +                         false)) +              ))) diff --git a/new-luxc/test/tests.lux b/new-luxc/test/tests.lux index cbff78c2e..a330560fc 100644 --- a/new-luxc/test/tests.lux +++ b/new-luxc/test/tests.lux @@ -6,7 +6,9 @@         [cli #+ program:]         [test])    (test (luxc ["_;" parser] -              (analyser ["_;" lux])))) +              (analyser ["_;" primitive] +                        ["_;" struct] +                        ["_;" reference]))))  ## [Program]  (program: args | 
