aboutsummaryrefslogtreecommitdiff
path: root/lux-jvm
diff options
context:
space:
mode:
authorEduardo Julian2022-03-14 18:27:37 -0400
committerEduardo Julian2022-03-14 18:27:37 -0400
commit41495e32d3f5f88b5f189f48dd4fdbfa883c6ac0 (patch)
tree7a561e83768d5ac4eb08855858dde38d2987fc46 /lux-jvm
parent62299ecdc93b39f6a22b1f89779f55dfa735fb3c (diff)
De-sigil-ification: >
Diffstat (limited to 'lux-jvm')
-rw-r--r--lux-jvm/source/luxc/lang/directive/jvm.lux16
-rw-r--r--lux-jvm/source/luxc/lang/translation/jvm/case.lux70
-rw-r--r--lux-jvm/source/luxc/lang/translation/jvm/function.lux6
-rw-r--r--lux-jvm/test/test/luxc/lang/analysis/host.jvm.lux549
-rw-r--r--lux-jvm/test/test/luxc/lang/synthesis/loop.lux162
-rw-r--r--lux-jvm/test/test/luxc/lang/synthesis/procedure.lux34
-rw-r--r--lux-jvm/test/test/luxc/lang/translation/js.lux160
-rw-r--r--lux-jvm/test/test/luxc/lang/translation/jvm.lux641
8 files changed, 46 insertions, 1592 deletions
diff --git a/lux-jvm/source/luxc/lang/directive/jvm.lux b/lux-jvm/source/luxc/lang/directive/jvm.lux
index 19e98ae20..323c337d5 100644
--- a/lux-jvm/source/luxc/lang/directive/jvm.lux
+++ b/lux-jvm/source/luxc/lang/directive/jvm.lux
@@ -5,7 +5,7 @@
[abstract
["[0]" monad {"+" do}]]
[control
- [pipe {"+" case>}]
+ ["[0]" pipe]
["[0]" try {"+" Try}]
["<>" parser
["<[0]>" code {"+" Parser}]
@@ -857,16 +857,16 @@
(def: visibility
(-> ffi.Privacy jvm.Visibility)
- (|>> (case> {ffi.#PublicP} {jvm.#Public}
- {ffi.#PrivateP} {jvm.#Private}
- {ffi.#ProtectedP} {jvm.#Protected}
- {ffi.#DefaultP} {jvm.#Default})))
+ (|>> (pipe.case {ffi.#PublicP} {jvm.#Public}
+ {ffi.#PrivateP} {jvm.#Private}
+ {ffi.#ProtectedP} {jvm.#Protected}
+ {ffi.#DefaultP} {jvm.#Default})))
(def: field_config
(-> ffi.State jvm.Field_Config)
- (|>> (case> {ffi.#VolatileS} jvm.volatileF
- {ffi.#FinalS} jvm.finalF
- {ffi.#DefaultS} jvm.noneF)))
+ (|>> (pipe.case {ffi.#VolatileS} jvm.volatileF
+ {ffi.#FinalS} jvm.finalF
+ {ffi.#DefaultS} jvm.noneF)))
(def: (field_header [name privacy state annotations type])
(-> Field jvm.Def)
diff --git a/lux-jvm/source/luxc/lang/translation/jvm/case.lux b/lux-jvm/source/luxc/lang/translation/jvm/case.lux
index 94a3deb05..9a5172966 100644
--- a/lux-jvm/source/luxc/lang/translation/jvm/case.lux
+++ b/lux-jvm/source/luxc/lang/translation/jvm/case.lux
@@ -1,39 +1,39 @@
(.using
- [library
- [lux {"-" Type Label Primitive if exec let case}
- [abstract
- ["[0]" monad {"+" do}]]
- [control
- ["[0]" function]
- ["ex" exception {"+" exception:}]]
- [data
- [collection
- ["[0]" list ("[1]@[0]" mix)]]]
- [math
- [number
- ["n" nat]]]
- [target
- [jvm
- ["[0]" type {"+" Type}
- ["[0]" category {"+" Void Value Return Primitive Object Class Array Var Parameter Method}]
- ["[0]" descriptor {"+" Descriptor}]
- ["[0]" signature {"+" Signature}]]]]
- [tool
- [compiler
- ["[0]" phase ("operation@[0]" monad)]
- [meta
- [archive {"+" Archive}]]
- [language
- [lux
- ["[0]" synthesis {"+" Path Synthesis}]]]]]]]
- [luxc
- [lang
- [host
- ["$" jvm {"+" Label Inst Operation Phase Generator}
- ["_" inst]]]]]
- ["[0]" //
- ["[0]" runtime]
- ["[0]" structure]])
+ [library
+ [lux {"-" Type Label Primitive if exec let case}
+ [abstract
+ ["[0]" monad {"+" do}]]
+ [control
+ ["[0]" function]
+ ["ex" exception {"+" exception:}]]
+ [data
+ [collection
+ ["[0]" list ("[1]@[0]" mix)]]]
+ [math
+ [number
+ ["n" nat]]]
+ [target
+ [jvm
+ ["[0]" type {"+" Type}
+ ["[0]" category {"+" Void Value Return Primitive Object Class Array Var Parameter Method}]
+ ["[0]" descriptor {"+" Descriptor}]
+ ["[0]" signature {"+" Signature}]]]]
+ [tool
+ [compiler
+ ["[0]" phase ("operation@[0]" monad)]
+ [meta
+ [archive {"+" Archive}]]
+ [language
+ [lux
+ ["[0]" synthesis {"+" Path Synthesis}]]]]]]]
+ [luxc
+ [lang
+ [host
+ ["$" jvm {"+" Label Inst Operation Phase Generator}
+ ["_" inst]]]]]
+ ["[0]" //
+ ["[0]" runtime]
+ ["[0]" structure]])
(def: (pop_altI stack_depth)
(-> Nat Inst)
diff --git a/lux-jvm/source/luxc/lang/translation/jvm/function.lux b/lux-jvm/source/luxc/lang/translation/jvm/function.lux
index 6c0e29730..92ca0e16c 100644
--- a/lux-jvm/source/luxc/lang/translation/jvm/function.lux
+++ b/lux-jvm/source/luxc/lang/translation/jvm/function.lux
@@ -5,7 +5,7 @@
["[0]" monad {"+" do}]
["[0]" enum]]
[control
- [pipe {"+" when> new>}]
+ ["[0]" pipe]
["[0]" function]]
[data
["[0]" product]
@@ -217,8 +217,8 @@
(cond (i.= over_extent (.int stage))
(|>> (_.label @label)
(_.ALOAD 0)
- (when> [(new> (n.> 0 stage) [])]
- [(_.INVOKEVIRTUAL class "reset" (reset_method class))])
+ (pipe.when [(pipe.new (n.> 0 stage) [])]
+ [(_.INVOKEVIRTUAL class "reset" (reset_method class))])
load_partialsI
(inputsI 1 apply_arity)
(_.INVOKEVIRTUAL class "impl" (implementation_method function_arity))
diff --git a/lux-jvm/test/test/luxc/lang/analysis/host.jvm.lux b/lux-jvm/test/test/luxc/lang/analysis/host.jvm.lux
deleted file mode 100644
index c42eddb60..000000000
--- a/lux-jvm/test/test/luxc/lang/analysis/host.jvm.lux
+++ /dev/null
@@ -1,549 +0,0 @@
-(.using
- [lux "*"
- [control
- pipe
- [monad {"+" do}]
- ["[0]" maybe]]
- [data
- ["e" error]
- ["[0]" product]
- [text ("text/" Equivalence<Text>)
- format]
- [collection
- ["[0]" array]
- [list ("list/" Mix<List>)]
- ["dict" dictionary]]]
- [math
- ["r" random "r/" Monad<Random>]]
- ["[0]" type]
- [macro {"+" Monad<Meta>}
- ["[0]" code]]
- [compiler
- ["[0]" default
- ["[0]L" init]
- [phase
- [analysis
- ["[0]A" type]]
- [extension
- [analysis
- ["[0]AE" host]]]]]]
- test]
- [///
- ["_[0]" primitive]])
-
-(template [<name> <success> <failure>]
- [(def: (<name> procedure params output-type)
- (-> Text (List Code) Type Bit)
- (|> (do Monad<Meta>
- [... runtime-bytecode @runtime.translate
- ]
- (default.with-scope
- (typeA.with-type output-type
- (_primitive.analyse (` ((~ (code.text procedure)) (~+ params)))))))
- (analysis.with-current-module "")
- (macro.result (initL.compiler []))
- (case> {e.#Success _}
- <success>
-
- {e.#Error error}
- <failure>)))]
-
- [success #1 #0]
- [failure #0 #1]
- )
-
-(template [<name> <success> <failure>]
- [(def: (<name> syntax output-type)
- (-> Code Type Bit)
- (|> (do Monad<Meta>
- [... runtime-bytecode @runtime.translate
- ]
- (default.with-scope
- (typeA.with-type output-type
- (_primitive.analyse syntax))))
- (analysis.with-current-module "")
- (macro.result (initL.compiler []))
- (case> {e.#Success _}
- <success>
-
- {e.#Error error}
- <failure>)))]
-
- [success' #1 #0]
- [failure' #0 #1]
- )
-
-(context: "Conversions [double + float]."
- (with-expansions [<conversions> (template [<procedure> <from> <to>]
- [(test (format <procedure> " SUCCESS")
- (success <procedure> (list (' ("lux coerce" (+0 <from> (+0)) []))) <to>))
- (test (format <procedure> " FAILURE")
- (failure <procedure> (list (' [])) <to>))]
-
- ["jvm convert double-to-float" "java.lang.Double" hostAE.Float]
- ["jvm convert double-to-int" "java.lang.Double" hostAE.Integer]
- ["jvm convert double-to-long" "java.lang.Double" hostAE.Long]
- ["jvm convert float-to-double" "java.lang.Float" hostAE.Double]
- ["jvm convert float-to-int" "java.lang.Float" hostAE.Integer]
- ["jvm convert float-to-long" "java.lang.Float" hostAE.Long]
- )]
- ($_ seq
- <conversions>
- )))
-
-(context: "Conversions [int]."
- (with-expansions [<conversions> (template [<procedure> <from> <to>]
- [(test (format <procedure> " SUCCESS")
- (success <procedure> (list (' ("lux coerce" (+0 <from> (+0)) []))) <to>))
- (test (format <procedure> " FAILURE")
- (failure <procedure> (list (' [])) <to>))]
-
- ["jvm convert int-to-byte" "java.lang.Integer" hostAE.Byte]
- ["jvm convert int-to-char" "java.lang.Integer" hostAE.Character]
- ["jvm convert int-to-double" "java.lang.Integer" hostAE.Double]
- ["jvm convert int-to-float" "java.lang.Integer" hostAE.Float]
- ["jvm convert int-to-long" "java.lang.Integer" hostAE.Long]
- ["jvm convert int-to-short" "java.lang.Integer" hostAE.Short]
- )]
- ($_ seq
- <conversions>
- )))
-
-(context: "Conversions [long]."
- (with-expansions [<conversions> (template [<procedure> <from> <to>]
- [(test (format <procedure> " SUCCESS")
- (success <procedure> (list (' ("lux coerce" (+0 <from> (+0)) []))) <to>))
- (test (format <procedure> " FAILURE")
- (failure <procedure> (list (' [])) <to>))]
-
- ["jvm convert long-to-double" "java.lang.Long" hostAE.Double]
- ["jvm convert long-to-float" "java.lang.Long" hostAE.Float]
- ["jvm convert long-to-int" "java.lang.Long" hostAE.Integer]
- ["jvm convert long-to-short" "java.lang.Long" hostAE.Short]
- ["jvm convert long-to-byte" "java.lang.Long" hostAE.Byte]
- )]
- ($_ seq
- <conversions>
- )))
-
-(context: "Conversions [char + byte + short]."
- (with-expansions [<conversions> (template [<procedure> <from> <to>]
- [(test (format <procedure> " SUCCESS")
- (success <procedure> (list (' ("lux coerce" (+0 <from> (+0)) []))) <to>))
- (test (format <procedure> " FAILURE")
- (failure <procedure> (list (' [])) <to>))]
-
- ["jvm convert char-to-byte" "java.lang.Character" hostAE.Byte]
- ["jvm convert char-to-short" "java.lang.Character" hostAE.Short]
- ["jvm convert char-to-int" "java.lang.Character" hostAE.Integer]
- ["jvm convert char-to-long" "java.lang.Character" hostAE.Long]
- ["jvm convert byte-to-long" "java.lang.Byte" hostAE.Long]
- ["jvm convert short-to-long" "java.lang.Short" hostAE.Long]
- )]
- ($_ seq
- <conversions>
- )))
-
-(template [<domain> <boxed> <type>]
- [(context: (format "Arithmetic " "[" <domain> "].")
- (with-expansions [<instructions> (template [<procedure> <subject> <param> <output>]
- [(test <procedure>
- (success <procedure>
- (list (' ("lux coerce" (+0 <subject> (+0)) []))
- (' ("lux coerce" (+0 <param> (+0)) [])))
- <output>))]
-
- [(format "jvm " <domain> " +") <boxed> <boxed> <type>]
- [(format "jvm " <domain> " -") <boxed> <boxed> <type>]
- [(format "jvm " <domain> " *") <boxed> <boxed> <type>]
- [(format "jvm " <domain> " /") <boxed> <boxed> <type>]
- [(format "jvm " <domain> " %") <boxed> <boxed> <type>]
- )]
- ($_ seq
- <instructions>
- )))
-
- (context: (format "Order " "[" <domain> "].")
- (with-expansions [<instructions> (template [<procedure> <subject> <param> <output>]
- [(test <procedure>
- (success <procedure>
- (list (' ("lux coerce" (+0 <subject> (+0)) []))
- (' ("lux coerce" (+0 <param> (+0)) [])))
- <output>))]
-
- [(format "jvm " <domain> " =") <boxed> <boxed> hostAE.Boolean]
- [(format "jvm " <domain> " <") <boxed> <boxed> hostAE.Boolean]
- )]
- ($_ seq
- <instructions>
- )))
-
- (context: (format "Bitwise " "[" <domain> "].")
- (with-expansions [<instructions> (template [<procedure> <subject> <param> <output>]
- [(test <procedure>
- (success <procedure>
- (list (' ("lux coerce" (+0 <subject> (+0)) []))
- (' ("lux coerce" (+0 <param> (+0)) [])))
- <output>))]
-
- [(format "jvm " <domain> " and") <boxed> <boxed> <type>]
- [(format "jvm " <domain> " or") <boxed> <boxed> <type>]
- [(format "jvm " <domain> " xor") <boxed> <boxed> <type>]
- [(format "jvm " <domain> " shl") <boxed> "java.lang.Integer" <type>]
- [(format "jvm " <domain> " shr") <boxed> "java.lang.Integer" <type>]
- [(format "jvm " <domain> " ushr") <boxed> "java.lang.Integer" <type>]
- )]
- ($_ seq
- <instructions>
- )))]
-
-
- ["int" "java.lang.Integer" hostAE.Integer]
- ["long" "java.lang.Long" hostAE.Long]
- )
-
-(template [<domain> <boxed> <type>]
- [(context: (format "Arithmetic " "[" <domain> "].")
- (with-expansions [<instructions> (template [<procedure> <subject> <param> <output>]
- [(test <procedure>
- (success <procedure>
- (list (' ("lux coerce" (+0 <subject> (+0)) []))
- (' ("lux coerce" (+0 <param> (+0)) [])))
- <output>))]
-
- [(format "jvm " <domain> " +") <boxed> <boxed> <type>]
- [(format "jvm " <domain> " -") <boxed> <boxed> <type>]
- [(format "jvm " <domain> " *") <boxed> <boxed> <type>]
- [(format "jvm " <domain> " /") <boxed> <boxed> <type>]
- [(format "jvm " <domain> " %") <boxed> <boxed> <type>]
- )]
- ($_ seq
- <instructions>
- )))
-
- (context: (format "Order " "[" <domain> "].")
- (with-expansions [<instructions> (template [<procedure> <subject> <param> <output>]
- [(test <procedure>
- (success <procedure>
- (list (' ("lux coerce" (+0 <subject> (+0)) []))
- (' ("lux coerce" (+0 <param> (+0)) [])))
- <output>))]
-
- [(format "jvm " <domain> " =") <boxed> <boxed> hostAE.Boolean]
- [(format "jvm " <domain> " <") <boxed> <boxed> hostAE.Boolean]
- )]
- ($_ seq
- <instructions>
- )))]
-
-
- ["float" "java.lang.Float" hostAE.Float]
- ["double" "java.lang.Double" hostAE.Double]
- )
-
-(template [<domain> <boxed> <type>]
- [(context: (format "Order " "[" <domain> "].")
- (with-expansions [<instructions> (template [<procedure> <subject> <param> <output>]
- [(test <procedure>
- (success <procedure>
- (list (' ("lux coerce" (+0 <subject> (+0)) []))
- (' ("lux coerce" (+0 <param> (+0)) [])))
- <output>))]
-
- [(format "jvm " <domain> " =") <boxed> <boxed> hostAE.Boolean]
- [(format "jvm " <domain> " <") <boxed> <boxed> hostAE.Boolean]
- )]
- ($_ seq
- <instructions>
- )))]
-
-
- ["char" "java.lang.Character" hostAE.Character]
- )
-
-(def: array-type
- (r.Random [Text Text])
- (let [entries (dict.entries hostAE.boxes)
- num-entries (list.size entries)]
- (do r.Monad<Random>
- [choice (|> r.nat (:: @ each (n/% (++ num-entries))))
- #let [[unboxed boxed] (: [Text Text]
- (|> entries
- (list.nth choice)
- (maybe.default ["java.lang.Object" "java.lang.Object"])))]]
- (wrap [unboxed boxed]))))
-
-(context: "Array."
- (<| (times +100)
- (do @
- [#let [cap (|>> (n/% +10) (n/max +1))]
- [unboxed boxed] array-type
- size (|> r.nat (:: @ each cap))
- idx (|> r.nat (:: @ each (n/% size)))
- level (|> r.nat (:: @ each cap))
- #let [unboxedT {.#Primitive unboxed (list)}
- arrayT {.#Primitive "#Array" (list unboxedT)}
- arrayC (`' ("lux check" (+0 "#Array" (+1 (+0 (~ (code.text unboxed)) (+0)) (+0)))
- ("jvm array new" (~ (code.nat size)))))
- boxedT {.#Primitive boxed (list)}
- boxedTC (` (+0 (~ (code.text boxed)) (+0)))
- multi-arrayT (list/mix (function (_ _ innerT)
- (|> innerT (list) {.#Primitive "#Array"}))
- boxedT
- (list.n/range +1 level))]]
- ($_ seq
- (test "jvm array new"
- (success "jvm array new"
- (list (code.nat size))
- arrayT))
- (test "jvm array new (no nesting)"
- (failure "jvm array new"
- (list (code.nat size))
- unboxedT))
- (test "jvm array new (nested/multi-level)"
- (success "jvm array new"
- (list (code.nat size))
- multi-arrayT))
- (test "jvm array length"
- (success "jvm array length"
- (list arrayC)
- Nat))
- (test "jvm array read"
- (success' (` ("jvm object cast"
- ("jvm array read" (~ arrayC) (~ (code.nat idx)))))
- boxedT))
- (test "jvm array write"
- (success "jvm array write"
- (list arrayC (code.nat idx) (`' ("lux coerce" (~ boxedTC) [])))
- arrayT))
- ))))
-
-(def: throwables
- (List Text)
- (list "java.lang.Throwable"
- "java.lang.Error"
- "java.io.IOError"
- "java.lang.VirtualMachineError"
- "java.lang.Exception"
- "java.io.IOException"
- "java.lang.RuntimeException"))
-
-(context: "Object."
- (<| (times +100)
- (do @
- [[unboxed boxed] array-type
- [!unboxed !boxed] (|> array-type
- (r.filter (function (_ [!unboxed !boxed])
- (not (text/= boxed !boxed)))))
- #let [boxedT {.#Primitive boxed (list)}
- boxedC (`' ("lux check" (+0 (~ (code.text boxed)) (+0))
- ("jvm object null")))
- !boxedC (`' ("lux check" (+0 (~ (code.text !boxed)) (+0))
- ("jvm object null")))
- unboxedC (`' ("lux check" (+0 (~ (code.text unboxed)) (+0))
- ("jvm object null")))]
- throwable (|> r.nat
- (:: @ each (n/% (++ (list.size throwables))))
- (:: @ each (function (_ idx)
- (|> throwables
- (list.nth idx)
- (maybe.default "java.lang.Object")))))
- #let [throwableC (`' ("lux check" (+0 (~ (code.text throwable)) (+0))
- ("jvm object null")))]]
- ($_ seq
- (test "jvm object null"
- (success "jvm object null"
- (list)
- {.#Primitive boxed (list)}))
- (test "jvm object null (no primitives)"
- (or (text/= "java.lang.Object" boxed)
- (failure "jvm object null"
- (list)
- {.#Primitive unboxed (list)})))
- (test "jvm object null?"
- (success "jvm object null?"
- (list boxedC)
- Bit))
- (test "jvm object synchronized"
- (success "jvm object synchronized"
- (list boxedC boxedC)
- boxedT))
- (test "jvm object synchronized (no primitives)"
- (or (text/= "java.lang.Object" boxed)
- (failure "jvm object synchronized"
- (list unboxedC boxedC)
- boxedT)))
- (test "jvm object throw"
- (or (text/= "java.lang.Object" throwable)
- (success "jvm object throw"
- (list throwableC)
- Nothing)))
- (test "jvm object class"
- (success "jvm object class"
- (list (code.text boxed))
- {.#Primitive "java.lang.Class" (list boxedT)}))
- (test "jvm object instance?"
- (success "jvm object instance?"
- (list (code.text boxed)
- boxedC)
- Bit))
- (test "jvm object instance? (lineage)"
- (success "jvm object instance?"
- (list (' "java.lang.Object")
- boxedC)
- Bit))
- (test "jvm object instance? (no lineage)"
- (or (text/= "java.lang.Object" boxed)
- (failure "jvm object instance?"
- (list (code.text boxed)
- !boxedC)
- Bit)))
- ))))
-
-(context: "Member [Static Field]."
- ($_ seq
- (test "jvm member static get"
- (success "jvm member static get"
- (list (code.text "java.lang.System")
- (code.text "out"))
- {.#Primitive "java.io.PrintStream" (list)}))
- (test "jvm member static get (inheritance out)"
- (success "jvm member static get"
- (list (code.text "java.lang.System")
- (code.text "out"))
- {.#Primitive "java.lang.Object" (list)}))
- (test "jvm member static put"
- (success "jvm member static put"
- (list (code.text "java.awt.datatransfer.DataFlavor")
- (code.text "allHtmlFlavor")
- (`' ("lux check" (+0 "java.awt.datatransfer.DataFlavor" (+0))
- ("jvm object null"))))
- Any))
- (test "jvm member static put (final)"
- (failure "jvm member static put"
- (list (code.text "java.lang.System")
- (code.text "out")
- (`' ("lux check" (+0 "java.io.PrintStream" (+0))
- ("jvm object null"))))
- Any))
- (test "jvm member static put (inheritance in)"
- (success "jvm member static put"
- (list (code.text "java.awt.datatransfer.DataFlavor")
- (code.text "allHtmlFlavor")
- (`' ("jvm object cast"
- ("lux check" (+0 "javax.activation.ActivationDataFlavor" (+0))
- ("jvm object null")))))
- Any))
- ))
-
-(context: "Member [Virtual Field]."
- ($_ seq
- (test "jvm member virtual get"
- (success "jvm member virtual get"
- (list (code.text "org.omg.CORBA.ValueMember")
- (code.text "id")
- (`' ("lux check" (+0 "org.omg.CORBA.ValueMember" (+0))
- ("jvm object null"))))
- {.#Primitive "java.lang.String" (list)}))
- (test "jvm member virtual get (inheritance out)"
- (success "jvm member virtual get"
- (list (code.text "org.omg.CORBA.ValueMember")
- (code.text "id")
- (`' ("lux check" (+0 "org.omg.CORBA.ValueMember" (+0))
- ("jvm object null"))))
- {.#Primitive "java.lang.Object" (list)}))
- (test "jvm member virtual put"
- (success "jvm member virtual put"
- (list (code.text "org.omg.CORBA.ValueMember")
- (code.text "id")
- (`' ("lux check" (+0 "java.lang.String" (+0))
- ("jvm object null")))
- (`' ("lux check" (+0 "org.omg.CORBA.ValueMember" (+0))
- ("jvm object null"))))
- (Primitive "org.omg.CORBA.ValueMember")))
- (test "jvm member virtual put (final)"
- (failure "jvm member virtual put"
- (list (code.text "javax.swing.text.html.parser.DTD")
- (code.text "applet")
- (`' ("lux check" (+0 "javax.swing.text.html.parser.Element" (+0))
- ("jvm object null")))
- (`' ("lux check" (+0 "javax.swing.text.html.parser.DTD" (+0))
- ("jvm object null"))))
- (Primitive "javax.swing.text.html.parser.DTD")))
- (test "jvm member virtual put (inheritance in)"
- (success "jvm member virtual put"
- (list (code.text "java.awt.GridBagConstraints")
- (code.text "insets")
- (`' ("jvm object cast"
- ("lux check" (+0 "javax.swing.plaf.InsetsUIResource" (+0))
- ("jvm object null"))))
- (`' ("lux check" (+0 "java.awt.GridBagConstraints" (+0))
- ("jvm object null"))))
- (Primitive "java.awt.GridBagConstraints")))
- ))
-
-(context: "Boxing/Unboxing."
- ($_ seq
- (test "jvm member static get"
- (success "jvm member static get"
- (list (code.text "java.util.GregorianCalendar")
- (code.text "AD"))
- {.#Primitive "java.lang.Integer" (list)}))
- (test "jvm member virtual get"
- (success "jvm member virtual get"
- (list (code.text "javax.accessibility.AccessibleAttributeSequence")
- (code.text "startIndex")
- (`' ("lux check" (+0 "javax.accessibility.AccessibleAttributeSequence" (+0))
- ("jvm object null"))))
- {.#Primitive "java.lang.Integer" (list)}))
- (test "jvm member virtual put"
- (success "jvm member virtual put"
- (list (code.text "javax.accessibility.AccessibleAttributeSequence")
- (code.text "startIndex")
- (`' ("jvm object cast"
- ("lux check" (+0 "java.lang.Integer" (+0))
- ("jvm object null"))))
- (`' ("lux check" (+0 "javax.accessibility.AccessibleAttributeSequence" (+0))
- ("jvm object null"))))
- (Primitive "javax.accessibility.AccessibleAttributeSequence")))
- ))
-
-(context: "Member [Method]."
- (let [longC (' ("lux coerce" (+0 "java.lang.Long" (+0))
- +123))
- intC (`' ("jvm convert long-to-int" (~ longC)))
- stringC (' ("lux coerce" (+0 "java.lang.String" (+0))
- "YOLO"))
- objectC (`' ("lux check" (+0 "java.util.ArrayList" (+1 (+0 "java.lang.Long" (+0)) (+0)))
- ("jvm member invoke constructor" "java.util.ArrayList"
- ["int" ("jvm object cast" (~ intC))])))]
- ($_ seq
- (test "jvm member invoke static"
- (success' (` ("jvm member invoke static"
- "java.lang.Long" "decode"
- ["java.lang.String" (~ stringC)]))
- {.#Primitive "java.lang.Long" (list)}))
- (test "jvm member invoke virtual"
- (success' (` ("jvm object cast"
- ("jvm member invoke virtual"
- "java.lang.Object" "equals"
- ("jvm object cast" (~ longC)) ["java.lang.Object" ("jvm object cast" (~ longC))])))
- {.#Primitive "java.lang.Boolean" (list)}))
- (test "jvm member invoke special"
- (success' (` ("jvm object cast"
- ("jvm member invoke special"
- "java.lang.Long" "equals"
- ("jvm object cast" (~ longC)) ["java.lang.Object" ("jvm object cast" (~ longC))])))
- {.#Primitive "java.lang.Boolean" (list)}))
- (test "jvm member invoke interface"
- (success' (` ("jvm object cast"
- ("jvm member invoke interface"
- "java.util.Collection" "add"
- ("jvm object cast" (~ objectC)) ["java.lang.Object" ("jvm object cast" (~ longC))])))
- {.#Primitive "java.lang.Boolean" (list)}))
- (test "jvm member invoke constructor"
- (success' (` ("jvm member invoke constructor"
- "java.util.ArrayList"
- ["int" ("jvm object cast" (~ intC))]))
- (All (_ a) {.#Primitive "java.util.ArrayList" (list a)})))
- )))
diff --git a/lux-jvm/test/test/luxc/lang/synthesis/loop.lux b/lux-jvm/test/test/luxc/lang/synthesis/loop.lux
deleted file mode 100644
index 51e4f3ace..000000000
--- a/lux-jvm/test/test/luxc/lang/synthesis/loop.lux
+++ /dev/null
@@ -1,162 +0,0 @@
-(.using
- lux
- (lux [io]
- (control [monad {"+" do}])
- (data [bit "bit/" Eq<Bit>]
- [number]
- (coll [list "list/" Functor<List>]
- (set ["set" unordered]))
- text/format)
- (macro [code])
- ["r" math/random "r/" Monad<Random>]
- test)
- (luxc (lang ["la" analysis]
- ["ls" synthesis]
- (synthesis ["[0]S" expression]
- ["[0]S" loop])
- ["[0]L" extension]))
- (// common))
-
-(def: (does-recursion? arity exprS)
- (-> ls.Arity ls.Synthesis Bit)
- (loop [exprS exprS]
- (case exprS
- (^ [_ {.#Form (list [_ {.#Text "lux case"}] inputS pathS)}])
- (loop [pathS pathS]
- (case pathS
- (^ [_ {.#Form (list [_ {.#Text "lux case alt"}] leftS rightS)}])
- (or (again leftS)
- (again rightS))
-
- (^ [_ {.#Form (list [_ {.#Text "lux case seq"}] leftS rightS)}])
- (again rightS)
-
- (^ [_ {.#Form (list [_ {.#Text "lux case exec"}] bodyS)}])
- (does-recursion? arity bodyS)
-
- _
- #0))
-
- (^ [_ {.#Form (list& [_ {.#Text "lux again"}] argsS)}])
- (n/= arity (list.size argsS))
-
- (^ [_ {.#Form (list [_ {.#Text "lux let"}] register inputS bodyS)}])
- (again bodyS)
-
- (^ [_ {.#Form (list [_ {.#Text "lux if"}] inputS thenS elseS)}])
- (or (again thenS)
- (again elseS))
-
- _
- #0
- )))
-
-(def: (gen-body arity output)
- (-> Nat la.Analysis (r.Random la.Analysis))
- (r.either (r.either (r/wrap output)
- (do r.Monad<Random>
- [inputA (|> r.nat (:: @ each code.nat))
- num-cases (|> r.nat (:: @ each (|>> (n/% +10) (n/max +1))))
- tests (|> (r.set number.Hash<Nat> num-cases r.nat)
- (:: @ each (|>> set.to-list (list/each code.nat))))
- #let [bad-bodies (list.repeat num-cases (' []))]
- good-body (gen-body arity output)
- where-to-set (|> r.nat (:: @ each (n/% num-cases)))
- #let [bodies (list.together (list (list.first where-to-set bad-bodies)
- (list good-body)
- (list.after (n/++ where-to-set) bad-bodies)))]]
- (wrap (` ("lux case" (~ inputA)
- (~ (code.record (list.zip2 tests bodies))))))))
- (r.either (do r.Monad<Random>
- [valueS r.bit
- output' (gen-body (n/++ arity) output)]
- (wrap (` ("lux case" (~ (code.bit valueS))
- {("lux case bind" (~ (code.nat arity))) (~ output')}))))
- (do r.Monad<Random>
- [valueS r.bit
- then|else r.bit
- output' (gen-body arity output)
- #let [thenA (if then|else output' (' []))
- elseA (if (not then|else) output' (' []))]]
- (wrap (` ("lux case" (~ (code.bit valueS))
- {(~ (code.bit then|else)) (~ thenA)
- (~ (code.bit (not then|else))) (~ elseA)})))))
- ))
-
-(def: (make-function arity body)
- (-> ls.Arity la.Analysis la.Analysis)
- (case arity
- +0 body
- _ (` ("lux function" [] (~ (make-function (n/-- arity) body))))))
-
-(def: gen-recursion
- (r.Random [Bit Nat la.Analysis])
- (do r.Monad<Random>
- [arity (|> r.nat (:: @ each (|>> (n/% +10) (n/max +1))))
- again? r.bit
- outputS (if again?
- (wrap (la.apply (list.repeat arity (' [])) (la.var 0)))
- (do @
- [plus-or-minus? r.bit
- how-much (|> r.nat (:: @ each (|>> (n/% arity) (n/max +1))))
- #let [shift (if plus-or-minus? n/+ n/-)]]
- (wrap (la.apply (list.repeat (shift how-much arity) (' [])) (la.var 0)))))
- bodyS (gen-body arity outputS)]
- (wrap [again? arity (make-function arity bodyS)])))
-
-(def: gen-loop
- (r.Random [Bit Nat la.Analysis])
- (do r.Monad<Random>
- [arity (|> r.nat (:: @ each (|>> (n/% +10) (n/max +1))))
- again? r.bit
- self-ref? r.bit
- #let [selfA (la.var 0)
- argA (if self-ref? selfA (' []))]
- outputS (if again?
- (wrap (la.apply (list.repeat arity argA) selfA))
- (do @
- [plus-or-minus? r.bit
- how-much (|> r.nat (:: @ each (|>> (n/% arity) (n/max +1))))
- #let [shift (if plus-or-minus? n/+ n/-)]]
- (wrap (la.apply (list.repeat (shift how-much arity) (' [])) selfA))))
- bodyS (gen-body arity outputS)]
- (wrap [(and again? (not self-ref?))
- arity
- (make-function arity bodyS)])))
-
-(context: "Recursion."
- (<| (times +100)
- (do @
- [[prediction arity analysis] gen-recursion]
- ($_ seq
- (test "Can accurately identify (and then reify) tail recursion."
- (case (expressionS.synthesize extensionL.no-syntheses
- analysis)
- (^ [_ {.#Form (list [_ {.#Text "lux function"}] [_ {.#Nat _arity}] [_ {.#Tuple _env}] _body)}])
- (|> _body
- (does-recursion? arity)
- (bit/= prediction)
- (and (n/= arity _arity)))
-
- _
- #0))))))
-
-(context: "Loop."
- (<| (times +100)
- (do @
- [[prediction arity analysis] gen-recursion]
- ($_ seq
- (test "Can reify loops."
- (case (expressionS.synthesize extensionL.no-syntheses
- (la.apply (list.repeat arity (' [])) analysis))
- (^ [_ {.#Form (list [_ {.#Text "lux loop"}] [_ {.#Nat in_register}] [_ {.#Tuple _inits}] _body)}])
- (and (n/= arity (list.size _inits))
- (not (loopS.contains-self-reference? _body)))
-
- (^ [_ {.#Form (list& [_ {.#Text "lux call"}]
- [_ {.#Form (list [_ {.#Text "lux function"}] _arity _env _bodyS)}]
- argsS)}])
- (loopS.contains-self-reference? _bodyS)
-
- _
- #0))))))
diff --git a/lux-jvm/test/test/luxc/lang/synthesis/procedure.lux b/lux-jvm/test/test/luxc/lang/synthesis/procedure.lux
deleted file mode 100644
index 73d8ee873..000000000
--- a/lux-jvm/test/test/luxc/lang/synthesis/procedure.lux
+++ /dev/null
@@ -1,34 +0,0 @@
-(.using
- lux
- (lux [io]
- (control [monad {"+" do}]
- pipe)
- (data [text "text/" Eq<Text>]
- [product]
- (coll [list]))
- ["r" math/random "r/" Monad<Random>]
- test)
- (luxc (lang ["la" analysis]
- ["ls" synthesis]
- (synthesis ["[0]S" expression])
- ["[0]L" extension]))
- (// common))
-
-(context: "Procedures"
- (<| (times +100)
- (do @
- [num-args (|> r.nat (:: @ each (n/% +10)))
- nameA (r.text +5)
- argsA (r.list num-args gen-primitive)]
- ($_ seq
- (test "Can synthesize procedure calls."
- (|> (expressionS.synthesize extensionL.no-syntheses
- (la.procedure nameA argsA))
- (case> (^ [_ {.#Form (list& [_ {.#Text procedure}] argsS)}])
- (and (text/= nameA procedure)
- (list.every? (product.uncurried corresponds?)
- (list.zip2 argsA argsS)))
-
- _
- #0)))
- ))))
diff --git a/lux-jvm/test/test/luxc/lang/translation/js.lux b/lux-jvm/test/test/luxc/lang/translation/js.lux
deleted file mode 100644
index 3487c24f8..000000000
--- a/lux-jvm/test/test/luxc/lang/translation/js.lux
+++ /dev/null
@@ -1,160 +0,0 @@
-(.using
- lux
- (lux [io {"+" IO}]
- (control [monad {"+" do}]
- pipe)
- (data ["e" error]
- text/format
- [number]
- (coll [list "list/" Functor<List>]
- [set]))
- [math]
- ["r" math/random]
- (macro [code])
- test)
- (luxc (lang [synthesis {"+" Synthesis}]))
- (test/luxc common))
-
-(def: upper-alpha-ascii
- (r.Random Nat)
- (|> r.nat (:: r.Functor<Random> each (|>> (n/% +91) (n/max +65)))))
-
-(def: (test-primitive-identity synthesis)
- (-> Synthesis Bit)
- (|> (run-js (` ("lux is" (~ synthesis) (~ synthesis))))
- (case> {e.#Success valueV}
- (:coerce Bit valueV)
-
- _
- #0)))
-
-(type: Check (-> (e.Error Any) Bit))
-
-(template [<name> <type> <pre> <=>]
- [(def: (<name> angle)
- (-> <type> Check)
- (|>> (case> {e.#Success valueV}
- (<=> (<pre> angle) (:coerce <type> valueV))
-
- {e.#Error error}
- #0)))]
-
- [sin-check Frac math.sin f/=]
- [length-check Nat id n/=]
- )
-
-(context: "[JS] Primitives."
- ($_ seq
- (test "Null is equal to itself."
- (test-primitive-identity (` ("js null"))))
- (test "Undefined is equal to itself."
- (test-primitive-identity (` ("js undefined"))))
- (test "Object comparison is by reference, not by value."
- (not (test-primitive-identity (` ("js object")))))
- (test "Values are equal to themselves."
- (test-primitive-identity (` ("js global" "Math"))))
- (<| (times +100)
- (do @
- [value r.int
- #let [frac-value (int-to-frac value)]]
- (test "Can call primitive functions."
- (|> (run-js (` ("js call" ("js global" "Math.sin") (~ (code.text (%f frac-value))))))
- (sin-check frac-value)))))
- ))
-
-(context: "[JS] Objects."
- (<| (times +100)
- (do @
- [field (:: @ each code.text (r.text' upper-alpha-ascii +5))
- value r.int
- #let [empty-object (` ("js object"))
- object (` ("js object set" (~ field) (~ (code.int value)) (~ empty-object)))
- frac-value (int-to-frac value)]]
- ($_ seq
- (test "Cannot get non-existing fields from objects."
- (|> (run-js (` ("js object get" (~ field) (~ empty-object))))
- (case> (^multi {e.#Success valueV}
- [(:coerce (Maybe Int) valueV) {.#None}])
- #1
-
- _
- #0)))
- (test "Can get fields from objects."
- (|> (run-js (` ("js object get" (~ field) (~ object))))
- (case> (^multi {e.#Success valueV}
- [(:coerce (Maybe Int) valueV) {.#Some valueV}])
- (i/= value (:coerce Int valueV))
-
- _
- #0)))
- (test "Can delete fields from objects."
- (|> (run-js (let [post-delete (` ("js object delete" (~ field) (~ object)))]
- (` ("js object get" (~ field) (~ post-delete)))))
- (case> (^multi {e.#Success valueV}
- [(:coerce (Maybe Int) valueV) {.#None}])
- #1
-
- _
- #0)))
- (test "Can instance new objects."
- (let [base (` ("js object new" ("js global" "Number") (~ (code.text (%f frac-value)))))]
- (|> (run-js (` ("lux frac +" (~ base) 0.0)))
- (case> {e.#Success valueV}
- (f/= frac-value (:coerce Frac valueV))
-
- {e.#Error error}
- #0))))
- (test "Can call methods on objects."
- (|> (run-js (` ("js object call" ("js global" "Math") "sin" (~ (code.text (%f frac-value))))))
- (sin-check frac-value)))
- ))))
-
-(context: "[JS] Arrays."
- (<| (times +100)
- (do @
- [length (|> r.nat (:: @ each (|>> (n/% +10) (n/max +1))))
- idx (|> r.nat (:: @ each (n/% length)))
- overwrite r.nat
- elems (|> (r.set number.Hash<Nat> length r.nat)
- (:: @ each set.to-list))
- #let [arrayS (` ("js array literal" (~+ (list/each code.nat elems))))]]
- ($_ seq
- (test "Can get the length of an array."
- (|> (run-js (` ("js array length" (~ arrayS))))
- (length-check length)))
- (test "Can get an element from an array."
- (|> (run-js (` ("js array read" (~ (code.nat idx)) (~ arrayS))))
- (case> (^multi {e.#Success elemV}
- [[(list.nth idx elems) (:coerce (Maybe Nat) elemV)]
- [{.#Some reference} {.#Some sample}]])
- (n/= reference sample)
-
- _
- #0)))
- (test "Can write an element into an array."
- (let [idxS (code.nat idx)
- overwriteS (code.nat overwrite)]
- (|> (run-js (` ("js array read" (~ idxS)
- ("js array write" (~ idxS) (~ overwriteS) (~ arrayS)))))
- (case> (^multi {e.#Success elemV}
- [(:coerce (Maybe Nat) elemV)
- {.#Some sample}])
- (n/= overwrite sample)
-
- _
- #0))))
- (test "Can delete an element from an array."
- (let [idxS (code.nat idx)
- deleteS (` ("js array delete" (~ idxS) (~ arrayS)))]
- (and (|> (run-js (` ("js array length" (~ deleteS))))
- (length-check length))
- (|> (run-js (` ("js array read" (~ idxS) (~ deleteS))))
- (case> (^multi {e.#Success elemV}
- [(:coerce (Maybe Nat) elemV)
- {.#None}])
- #1
-
- _
- #0))
- )))
- ))))
diff --git a/lux-jvm/test/test/luxc/lang/translation/jvm.lux b/lux-jvm/test/test/luxc/lang/translation/jvm.lux
deleted file mode 100644
index 57074884c..000000000
--- a/lux-jvm/test/test/luxc/lang/translation/jvm.lux
+++ /dev/null
@@ -1,641 +0,0 @@
-(.using
- lux
- (lux [io]
- (control pipe
- [monad {"+" do}]
- [maybe])
- (data ["e" error]
- [bit]
- [bit "bit/" Eq<Bit>]
- [number "int/" Number<Int> Codec<Text,Int>]
- [text "text/" Eq<Text>]
- text/format
- (coll [list]))
- ["r" math/random "r/" Monad<Random>]
- [macro]
- (macro [code])
- [host]
- test)
- (luxc [lang]
- (lang ["[0]L" host]
- ["ls" synthesis]
- (translation (jvm ["[0]T" expression]
- ["[0]T" eval]
- ["[0]T" runtime]))))
- (test/luxc common))
-
-(context: "Conversions [Part 1]"
- (<| (times +100)
- (do @
- [int-sample (|> r.int (:: @ each (i/% 128)))
- #let [frac-sample (int-to-frac int-sample)]]
- (with-expansions [<2step> (template [<step1> <step2> <tag> <sample> <cast> <test>]
- [(test (format <step1> " / " <step2>)
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (|> (~ (<tag> <sample>)) <step1> <step2> (`)))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success valueT}
- (<test> <sample> (:coerce <cast> valueT))
-
- {e.#Error error}
- #0)))]
-
- ["jvm convert double-to-float" "jvm convert float-to-double" code.frac frac-sample Frac f/=]
- ["jvm convert double-to-int" "jvm convert int-to-double" code.frac frac-sample Frac f/=]
- ["jvm convert double-to-long" "jvm convert long-to-double" code.frac frac-sample Frac f/=]
-
- ["jvm convert long-to-float" "jvm convert float-to-long" code.int int-sample Int i/=]
- ["jvm convert long-to-int" "jvm convert int-to-long" code.int int-sample Int i/=]
- ["jvm convert long-to-short" "jvm convert short-to-long" code.int int-sample Int i/=]
- ["jvm convert long-to-byte" "jvm convert byte-to-long" code.int int-sample Int i/=]
- )]
- ($_ seq
- <2step>
- )))))
-
-(context: "Conversions [Part 2]"
- (<| (times +100)
- (do @
- [int-sample (|> r.int (:: @ each (|>> (i/% 128) int/abs)))
- #let [frac-sample (int-to-frac int-sample)]]
- (`` ($_ seq
- (~~ (template [<step1> <step2> <step3> <tag> <sample> <cast> <test>]
- [(test (format <step1> " / " <step2> " / " <step3>)
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (|> (~ (<tag> <sample>)) <step1> <step2> <step3> (`)))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success valueT}
- (<test> <sample> (:coerce <cast> valueT))
-
- {e.#Error error}
- #0)))]
-
- ["jvm convert long-to-int" "jvm convert int-to-char" "jvm convert char-to-long" code.int int-sample Int i/=]
- ["jvm convert long-to-int" "jvm convert int-to-byte" "jvm convert byte-to-long" code.int int-sample Int i/=]
- ["jvm convert long-to-int" "jvm convert int-to-short" "jvm convert short-to-long" code.int int-sample Int i/=]
- ["jvm convert long-to-float" "jvm convert float-to-int" "jvm convert int-to-long" code.int int-sample Int i/=]
- ["jvm convert long-to-int" "jvm convert int-to-float" "jvm convert float-to-long" code.int int-sample Int i/=]
- ))
- )))))
-
-(context: "Conversions [Part 3]"
- (<| (times +100)
- (do @
- [int-sample (|> r.int (:: @ each (|>> (i/% 128) int/abs)))
- #let [frac-sample (int-to-frac int-sample)]]
- (`` ($_ seq
- (~~ (template [<step1> <step2> <step3> <step4> <tag> <sample> <cast> <test>]
- [(test (format <step1> " / " <step2> " / " <step3>)
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (|> (~ (<tag> <sample>)) <step1> <step2> <step3> <step4> (`)))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success valueT}
- (<test> <sample> (:coerce <cast> valueT))
-
- {e.#Error error}
- #0)))]
-
- ["jvm convert long-to-int" "jvm convert int-to-char" "jvm convert char-to-byte" "jvm convert byte-to-long" code.int int-sample Int i/=]
- ["jvm convert long-to-int" "jvm convert int-to-char" "jvm convert char-to-short" "jvm convert short-to-long" code.int int-sample Int i/=]
- ["jvm convert long-to-int" "jvm convert int-to-char" "jvm convert char-to-int" "jvm convert int-to-long" code.int int-sample Int i/=]
- ))
- )))))
-
-(def: gen-nat
- (r.Random Nat)
- (|> r.nat
- (r/each (n/% +128))
- (r.filter (|>> (n/= +0) not))))
-
-(def: gen-int
- (r.Random Int)
- (|> gen-nat (r/each nat-to-int)))
-
-(def: gen-frac
- (r.Random Frac)
- (|> gen-int (r/each int-to-frac)))
-
-(template [<domain> <generator> <tag> <type> <test> <augmentation> <+> <-> <*> </> <%> <pre> <post>]
- [(context: (format "Arithmetic [" <domain> "]")
- (<| (times +100)
- (do @
- [param <generator>
- #let [subject (<augmentation> param)]]
- (with-expansions [<tests> (template [<procedure> <reference>]
- [(test <procedure>
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (<post> ((code.text <procedure>)
- (<pre> (<tag> subject))
- (<pre> (<tag> param)))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success valueT}
- (<test> (<reference> param subject)
- (:coerce <type> valueT))
-
- {e.#Error error}
- #0)))]
-
- [(format "jvm " <domain> " +") <+>]
- [(format "jvm " <domain> " -") <->]
- [(format "jvm " <domain> " *") <*>]
- [(format "jvm " <domain> " /") </>]
- [(format "jvm " <domain> " %") <%>]
- )]
- ($_ seq
- <tests>
- )))))]
-
- ["int" gen-int code.int Int i/= (i/* 10) i/+ i/- i/* i// i/% "jvm convert long-to-int" "jvm convert int-to-long"]
- ["long" gen-int code.int Int i/= (i/* 10) i/+ i/- i/* i// i/% id id]
- ["float" gen-frac code.frac Frac f/= (f/* 10.0) f/+ f/- f/* f// f/% "jvm convert double-to-float" "jvm convert float-to-double"]
- ["double" gen-frac code.frac Frac f/= (f/* 10.0) f/+ f/- f/* f// f/% id id]
- )
-
-(template [<domain> <post> <convert>]
- [(context: (format "Bit-wise [" <domain> "] { Combiners ]")
- (<| (times +100)
- (do @
- [param gen-nat
- subject gen-nat]
- (`` ($_ seq
- (~~ (template [<procedure> <reference>]
- [(test <procedure>
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (<post> ((code.text <procedure>)
- (<convert> (code.nat subject))
- (<convert> (code.nat param)))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success valueT}
- (n/= (<reference> param subject)
- (:coerce Nat valueT))
-
- {e.#Error error}
- #0)))]
-
- [(format "jvm " <domain> " and") bit.and]
- [(format "jvm " <domain> " or") bit.or]
- [(format "jvm " <domain> " xor") bit.xor]
- ))
- )))))]
-
- ["int" "jvm convert int-to-long" "jvm convert long-to-int"]
- ["long" id id]
- )
-
-(template [<domain> <post> <convert>]
- [(context: (format "Bit-wise [" <domain> "] { Shifters }")
- (<| (times +100)
- (do @
- [param gen-nat
- subject gen-nat
- #let [shift (n/% +10 param)]]
- (`` ($_ seq
- (~~ (template [<procedure> <reference> <type> <test> <pre-subject> <pre>]
- [(test <procedure>
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (<post> ((code.text <procedure>)
- (<convert> (<pre> subject))
- ("jvm convert long-to-int" (code.nat shift)))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success valueT}
- (<test> (<reference> shift (<pre-subject> subject))
- (:coerce <type> valueT))
-
- {e.#Error error}
- #0)))]
-
- [(format "jvm " <domain> " shl") bit.left-shift Nat n/= id code.nat]
- [(format "jvm " <domain> " shr") bit.arithmetic-right-shift Int i/= nat-to-int (|>> nat-to-int code.int)]
- [(format "jvm " <domain> " ushr") bit.logical-right-shift Nat n/= id code.nat]
- ))
- )))))]
-
- ["int" "jvm convert int-to-long" "jvm convert long-to-int"]
- ["long" id id]
- )
-
-(template [<domain> <generator> <tag> <=> <<> <pre>]
- [(context: (format "Order [" <domain> "]")
- (<| (times +100)
- (do @
- [param <generator>
- subject <generator>]
- (with-expansions [<tests> (template [<procedure> <reference>]
- [(test <procedure>
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate ((code.text <procedure>)
- (<pre> (<tag> subject))
- (<pre> (<tag> param))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success valueT}
- (bit/= (<reference> param subject)
- (:coerce Bit valueT))
-
- {e.#Error error}
- #0)))]
-
- [(format "jvm " <domain> " =") <=>]
- [(format "jvm " <domain> " <") <<>]
- )]
- ($_ seq
- <tests>
- )))))]
-
- ["int" gen-int code.int i/= i/< "jvm convert long-to-int"]
- ["long" gen-int code.int i/= i/< id]
- ["float" gen-frac code.frac f/= f/< "jvm convert double-to-float"]
- ["double" gen-frac code.frac f/= f/< id]
- ["char" gen-int code.int i/= i/< "jvm convert long-to-char"]
- )
-
-(def: (jvm//array//new dimension class size)
- (-> Nat Text Nat ls.Synthesis)
- (` ("jvm array new" (~ (code.nat dimension)) (~ (code.text class)) (~ (code.nat size)))))
-
-(def: (jvm//array//write class idx inputS arrayS)
- (-> Text Nat ls.Synthesis ls.Synthesis ls.Synthesis)
- (` ("jvm array write" (~ (code.text class)) (~ (code.nat idx)) (~ inputS) (~ arrayS))))
-
-(def: (jvm//array//read class idx arrayS)
- (-> Text Nat ls.Synthesis ls.Synthesis)
- (` ("jvm array read" (~ (code.text class)) (~ (code.nat idx)) (~ arrayS))))
-
-(context: "Array [Part 1]"
- (<| (times +100)
- (do @
- [size (|> r.nat (:: @ each (|>> (n/% +10) (n/max +1))))
- idx (|> r.nat (:: @ each (n/% size)))
- valueZ r.bit
- valueB gen-int
- valueS gen-int
- valueI gen-int
- valueL r.int
- valueF gen-frac
- valueD r.frac
- valueC gen-int]
- (with-expansions [<array> (template [<class> <type> <value> <test> <input> <post>]
- [(test <class>
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (|> (jvm//array//new +0 <class> size)
- (jvm//array//write <class> idx <input>)
- (jvm//array//read <class> idx)
- <post>))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputZ}
- (<test> <value> (:coerce <type> outputZ))
-
- {e.#Error error}
- #0)))]
-
- ["boolean" Bit valueZ bit/= (code.bit valueZ)
- id]
- ["byte" Int valueB i/= (|> (code.int valueB) (~) "jvm convert long-to-byte" (`))
- "jvm convert byte-to-long"]
- ["short" Int valueS i/= (|> (code.int valueS) (~) "jvm convert long-to-short" (`))
- "jvm convert short-to-long"]
- ["int" Int valueI i/= (|> (code.int valueI) (~) "jvm convert long-to-int" (`))
- "jvm convert int-to-long"]
- ["long" Int valueL i/= (code.int valueL)
- id]
- ["float" Frac valueF f/= (|> (code.frac valueF) (~) "jvm convert double-to-float" (`))
- "jvm convert float-to-double"]
- ["double" Frac valueD f/= (code.frac valueD)
- id]
- )]
- ($_ seq
- <array>
- )))))
-
-(context: "Array [Part 2]"
- (<| (times +100)
- (do @
- [size (|> r.nat (:: @ each (|>> (n/% +10) (n/max +1))))
- idx (|> r.nat (:: @ each (n/% size)))
- valueZ r.bit
- valueB gen-int
- valueS gen-int
- valueI gen-int
- valueL r.int
- valueF gen-frac
- valueD r.frac
- valueC gen-int]
- (with-expansions [<array> (template [<class> <type> <value> <test> <input> <post>]
- [(test <class>
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (|> (jvm//array//new +0 <class> size)
- (jvm//array//write <class> idx <input>)
- (jvm//array//read <class> idx)
- <post>))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (<test> <value> (:coerce <type> outputT))
-
- {e.#Error error}
- #0)))]
-
- ["char" Int valueC i/=
- (|> (code.int valueC) (~) "jvm convert long-to-int" "jvm convert int-to-char" (`))
- "jvm convert char-to-long"]
- ["java.lang.Long" Int valueL i/=
- (code.int valueL)
- id]
- )]
- ($_ seq
- <array>
- (test "java.lang.Double (level 1)"
- (|> (do macro.Monad<Meta>
- [#let [inner (|> ("jvm array new" +0 "java.lang.Double" (~ (code.nat size)))
- ("jvm array write" "java.lang.Double" (~ (code.nat idx)) (~ (code.frac valueD)))
- (`))]
- sampleI (expressionT.translate (|> ("jvm array new" +1 "java.lang.Double" (~ (code.nat size)))
- ("jvm array write" "#Array" (~ (code.nat idx)) (~ inner))
- ("jvm array read" "#Array" (~ (code.nat idx)))
- ("jvm array read" "java.lang.Double" (~ (code.nat idx)))
- (`)))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (f/= valueD (:coerce Frac outputT))
-
- {e.#Error error}
- #0)))
- (test "jvm array length"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm array length" ("jvm array new" +0 "java.lang.Object" (~ (code.nat size))))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (n/= size (:coerce Nat outputT))
-
- {e.#Error error}
- #0)))
- )))))
-
-(host.import: java/lang/Class
- (getName [] String))
-
-(def: classes
- (List Text)
- (list "java.lang.Object" "java.lang.Class"
- "java.lang.String" "java.lang.Number"))
-
-(def: instances
- (List [Text (r.Random ls.Synthesis)])
- (let [gen-boolean (|> r.bit (:: r.Functor<Random> each code.bit))
- gen-integer (|> r.int (:: r.Functor<Random> each code.int))
- gen-double (|> r.frac (:: r.Functor<Random> each code.frac))
- gen-string (|> (r.text +5) (:: r.Functor<Random> each code.text))]
- (list ["java.lang.Boolean" gen-boolean]
- ["java.lang.Long" gen-integer]
- ["java.lang.Double" gen-double]
- ["java.lang.String" gen-string]
- ["java.lang.Object" (r.either (r.either gen-boolean
- gen-integer)
- (r.either gen-double
- gen-string))])))
-
-(context: "Object."
- (<| (times +100)
- (do @
- [#let [num-classes (list.size classes)]
- #let [num-instances (list.size instances)]
- class-idx (|> r.nat (:: @ each (n/% num-classes)))
- instance-idx (|> r.nat (:: @ each (n/% num-instances)))
- exception-message (r.text +5)
- #let [class (maybe.trusted (list.nth class-idx classes))
- [instance-class instance-gen] (maybe.trusted (list.nth instance-idx instances))
- exception-message$ (` ["java.lang.String" (~ (code.text exception-message))])]
- sample r.int
- monitor r.int
- instance instance-gen]
- ($_ seq
- (test "jvm object null"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm object null?" ("jvm object null"))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (:coerce Bit outputT)
-
- {e.#Error error}
- #0)))
- (test "jvm object null?"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm object null?" (~ (code.int sample)))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (not (:coerce Bit outputT))
-
- {e.#Error error}
- #0)))
- (test "jvm object synchronized"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm object synchronized" (~ (code.int monitor)) (~ (code.int sample)))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (i/= sample (:coerce Int outputT))
-
- {e.#Error error}
- #0)))
- (test "jvm object throw"
- (|> (do macro.Monad<Meta>
- [_ runtimeT.translate
- sampleI (expressionT.translate (` ("lux try" ("lux function" +1 []
- ("jvm object throw" ("jvm member invoke constructor"
- "java.lang.Throwable"
- (~ exception-message$)))))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (case (:coerce (e.Error Any) outputT)
- {e.#Error error}
- (text.contains? exception-message error)
-
- {e.#Success outputT}
- #0)
-
- {e.#Error error}
- #0)))
- (test "jvm object class"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm object class" (~ (code.text class)))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (|> outputT (:coerce Class) (Class::getName []) (text/= class))
-
- {e.#Error error}
- #0)))
- (test "jvm object instance?"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm object instance?" (~ (code.text instance-class)) (~ instance))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (:coerce Bit outputT)
-
- {e.#Error error}
- #0)))
- ))))
-
-(host.import: java/util/GregorianCalendar
- ("static" AD int))
-
-(context: "Member [Field]"
- (<| (times +100)
- (do @
- [sample-short (|> r.int (:: @ each (|>> int/abs (i/% 100))))
- sample-string (r.text +5)
- other-sample-string (r.text +5)
- #let [shortS (` ["short" ("jvm object cast" "java.lang.Short" "short"
- ("jvm convert long-to-short" (~ (code.int sample-short))))])
- stringS (` ["java.lang.String" (~ (code.text sample-string))])
- type-codeS (` ["org.omg.CORBA.TypeCode" ("jvm object null")])
- idl-typeS (` ["org.omg.CORBA.IDLType" ("jvm object null")])
- value-memberS (` ("jvm member invoke constructor"
- "org.omg.CORBA.ValueMember"
- (~ stringS) (~ stringS) (~ stringS) (~ stringS)
- (~ type-codeS) (~ idl-typeS) (~ shortS)))]]
- ($_ seq
- (test "jvm member static get"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm convert int-to-long" ("jvm member static get" "java.util.GregorianCalendar" "AD" "int"))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (i/= GregorianCalendar::AD (:coerce Int outputT))
-
- {e.#Error error}
- #0)))
- (test "jvm member static put"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm member static put" "java.awt.datatransfer.DataFlavor" "allHtmlFlavor" "java.awt.datatransfer.DataFlavor"
- ("jvm member static get" "java.awt.datatransfer.DataFlavor" "allHtmlFlavor" "java.awt.datatransfer.DataFlavor"))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (same? hostL.unit (:coerce Text outputT))
-
- {e.#Error error}
- #0)))
- (test "jvm member virtual get"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm member virtual get" "org.omg.CORBA.ValueMember" "name" "java.lang.String" (~ value-memberS))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (text/= sample-string (:coerce Text outputT))
-
- {e.#Error error}
- #0)))
- (test "jvm member virtual put"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm member virtual get" "org.omg.CORBA.ValueMember" "name" "java.lang.String"
- ("jvm member virtual put" "org.omg.CORBA.ValueMember" "name" "java.lang.String"
- (~ (code.text other-sample-string)) (~ value-memberS)))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (text/= other-sample-string (:coerce Text outputT))
-
- {e.#Error error}
- #0)))
- ))))
-
-(host.import: java/lang/Object)
-
-(host.import: (java/util/ArrayList a))
-
-(context: "Member [Method]"
- (<| (times +100)
- (do @
- [sample (|> r.int (:: @ each (|>> int/abs (i/% 100))))
- #let [object-longS (` ["java.lang.Object" (~ (code.int sample))])
- intS (` ["int" ("jvm object cast" "java.lang.Integer" "int"
- ("jvm convert long-to-int" (~ (code.int sample))))])
- coded-intS (` ["java.lang.String" (~ (code.text (int/encode sample)))])
- array-listS (` ("jvm member invoke constructor" "java.util.ArrayList" (~ intS)))]]
- ($_ seq
- (test "jvm member invoke static"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm member invoke static" "java.lang.Long"
- "decode" "java.lang.Long"
- (~ coded-intS))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (i/= sample (:coerce Int outputT))
-
- {e.#Error error}
- #0)))
- (test "jvm member invoke virtual"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm object cast" "boolean" "java.lang.Boolean"
- ("jvm member invoke virtual" "java.lang.Object" "equals" "boolean"
- (~ (code.int sample)) (~ object-longS)))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (:coerce Bit outputT)
-
- {e.#Error error}
- #0)))
- (test "jvm member invoke interface"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate (` ("jvm object cast" "boolean" "java.lang.Boolean"
- ("jvm member invoke interface" "java.util.Collection" "add" "boolean"
- (~ array-listS) (~ object-longS)))))]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (:coerce Bit outputT)
-
- {e.#Error error}
- #0)))
- (test "jvm member invoke constructor"
- (|> (do macro.Monad<Meta>
- [sampleI (expressionT.translate array-listS)]
- (evalT.eval sampleI))
- (lang.with-current-module "")
- (macro.result (io.run! init-jvm))
- (case> {e.#Success outputT}
- (host.instance? ArrayList (:coerce Object outputT))
-
- {e.#Error error}
- #0)))
- ))))