aboutsummaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-08-21 11:30:16 +0000
committers-ol <s+removethis@s-ol.nu>2025-03-02 14:24:49 +0000
commit950dd72215f375fe37d8dc5d78152ccf452d5e46 (patch)
treea17591a435eac84f85a0b5933ca14336322a5e1e /spec
parentdirty (remove) implementation (diff)
downloadalive-950dd72215f375fe37d8dc5d78152ccf452d5e46.tar.gz
alive-950dd72215f375fe37d8dc5d78152ccf452d5e46.zip
move array ops into library, implement concat and size
Diffstat (limited to 'spec')
-rw-r--r--spec/lang/array_spec.moon72
-rw-r--r--spec/test_setup.moon6
2 files changed, 49 insertions, 29 deletions
diff --git a/spec/lang/array_spec.moon b/spec/lang/array_spec.moon
index 2dd2894..fc7ce43 100644
--- a/spec/lang/array_spec.moon
+++ b/spec/lang/array_spec.moon
@@ -2,7 +2,7 @@ import TestPilot from require 'spec.test_setup'
import T, Array, Constant from require 'alv'
describe "array", ->
- test = TestPilot ''
+ test = TestPilot '', '(import* array)\n'
svec3 = Array 3, T.str
@@ -16,15 +16,6 @@ describe "array", ->
err = assert.has.error -> COPILOT\eval_once '(array 1 false)'
assert.matches "argument error: couldn't match arguments", err
- it "length can be read using (len)", ->
- rt = COPILOT\eval_once '(len (array 1))'
- assert.is.true rt\is_const!
- assert.is.equal (Constant.num 1), rt.result
-
- rt = COPILOT\eval_once '(len (array 1 2 3))'
- assert.is.true rt\is_const!
- assert.is.equal (Constant.num 3), rt.result
-
describe "(set)", ->
it "can swap values", ->
rt = COPILOT\eval_once '(set (array "f" "b" "c") 0 "a")'
@@ -33,7 +24,7 @@ describe "array", ->
it "checks value type", ->
err = assert.has.error -> COPILOT\eval_once '(set (array 1) 0 "a")'
- assert.matches "expected value for key '0' to be num, not str", err
+ assert.matches "expected value of type num, not str", err
it "checks index range", ->
err = assert.has.error -> COPILOT\eval_once '(set (array 1 2) -1 0)'
@@ -47,18 +38,13 @@ describe "array", ->
assert.matches "index '2' out of range!", err
describe "(get)", ->
- it "can peek a value", ->
- rt = COPILOT\eval_once '(get (array 1 2))'
- assert.is.true rt\is_const!
- assert.is.equal (Constant.num 2), rt.result
-
it "can get a value", ->
rt = COPILOT\eval_once '(get (array 1 2) 0)'
assert.is.true rt\is_const!
assert.is.equal (Constant.num 1), rt.result
it "checks index range", ->
- err = assert.has.error -> COPILOT\eval_once '(get (array 1 2) -1 0)'
+ err = assert.has.error -> COPILOT\eval_once '(get (array 1 2) -1)'
assert.matches "index '%-1' out of range!", err
COPILOT\eval_once '(get (array 1 2) 0)'
@@ -68,12 +54,42 @@ describe "array", ->
err = assert.has.error -> COPILOT\eval_once '(get (array 1 2) 2)'
assert.matches "index '2' out of range!", err
- describe "(insert)", ->
- it "can append a value", ->
- rt = COPILOT\eval_once '(insert (array "a" "b") "c")'
+ describe '(head)', ->
+ it "can peek a value", ->
+ rt = COPILOT\eval_once '(head (array 1 2))'
assert.is.true rt\is_const!
- assert.is.equal svec3\mk_const({ 'a', 'b', 'c' }), rt.result
+ assert.is.equal (Constant.num 1), rt.result
+
+ describe '(tail)', ->
+ it "gets rest of an array", ->
+ rt = COPILOT\eval_once '(tail (array 1))'
+ assert.is.true rt\is_const!
+ assert.is.same (Array 0, T.num), rt.result.type
+ assert.is.same {}, rt.result!
+
+ rt = COPILOT\eval_once '(tail (array 1 2))'
+ assert.is.true rt\is_const!
+ assert.is.same (Array 1, T.num), rt.result.type
+ assert.is.same { 2 }, rt.result!
+ rt = COPILOT\eval_once '(tail (array 1 2 3 4))'
+ assert.is.true rt\is_const!
+ assert.is.same (Array 3, T.num), rt.result.type
+ assert.is.same { 2, 3, 4 }, rt.result!
+
+ describe '(prepend)', ->
+ it "prepends to array", ->
+ rt = COPILOT\eval_once '(prepend (array 2) 1)'
+ assert.is.true rt\is_const!
+ assert.is.same (Array 2, T.num), rt.result.type
+ assert.is.same { 1, 2 }, rt.result!
+
+ rt = COPILOT\eval_once '(prepend (array 2 3 4) 1)'
+ assert.is.true rt\is_const!
+ assert.is.same (Array 4, T.num), rt.result.type
+ assert.is.same { 1, 2, 3, 4 }, rt.result!
+
+ describe "(insert)", ->
it "can insert a value", ->
rt = COPILOT\eval_once '(insert (array "b" "c") 0 "a")'
assert.is.true rt\is_const!
@@ -101,11 +117,6 @@ describe "array", ->
assert.matches "index '3' out of range!", err
describe "(remove)", ->
- it "can pop a value", ->
- rt = COPILOT\eval_once '(remove (array "a" "b" "c" "d"))'
- assert.is.true rt\is_const!
- assert.is.equal svec3\mk_const({ 'a', 'b', 'c' }), rt.result
-
it "can remove a value", ->
rt = COPILOT\eval_once '(remove (array "d" "a" "b" "c") 0)'
assert.is.true rt\is_const!
@@ -126,3 +137,12 @@ describe "array", ->
rt = COPILOT\eval_once '(concat (array "a" "b") (array "c"))'
assert.is.true rt\is_const!
assert.is.equal svec3\mk_const({ 'a', 'b', 'c' }), rt.result
+
+ it "size can be read using (size)", ->
+ rt = COPILOT\eval_once '(size (array 1))'
+ assert.is.true rt\is_const!
+ assert.is.equal (Constant.num 1), rt.result
+
+ rt = COPILOT\eval_once '(size (array 1 2 3))'
+ assert.is.true rt\is_const!
+ assert.is.equal (Constant.num 3), rt.result
diff --git a/spec/test_setup.moon b/spec/test_setup.moon
index 2bcd9df..92756a8 100644
--- a/spec/test_setup.moon
+++ b/spec/test_setup.moon
@@ -15,13 +15,13 @@ os.time = do
export COPILOT
class TestPilot extends Copilot
- new: (code) =>
+ new: (code, @preamble) =>
super!
COPILOT = @
if code
- @active_module = StringModule 'main', code
+ @active_module = StringModule 'main', @preamble .. code
@last_modules.__root = @active_module
@tick!
else
@@ -33,7 +33,7 @@ class TestPilot extends Copilot
next_tick: => @T += 1
eval_once: (code) =>
- @active_module\spit code
+ @active_module\spit @preamble .. code
@tick!
@active_module.root