aboutsummaryrefslogtreecommitdiffstats
path: root/spec/core
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-03-02 17:27:19 +0000
committers-ol <s-ol@users.noreply.github.com>2020-03-02 17:43:17 +0000
commitd8e2bad7d08bb96937815de4f3fd1bcbe2c440bd (patch)
tree64463299ae1b363a2addde0559f094193dd94759 /spec/core
parentlift remaining libs to new op interface (diff)
downloadalive-d8e2bad7d08bb96937815de4f3fd1bcbe2c440bd.tar.gz
alive-d8e2bad7d08bb96937815de4f3fd1bcbe2c440bd.zip
dynamic scoping
Diffstat (limited to 'spec/core')
-rw-r--r--spec/core/scope_spec.moon50
1 files changed, 47 insertions, 3 deletions
diff --git a/spec/core/scope_spec.moon b/spec/core/scope_spec.moon
index 471bbce..563f243 100644
--- a/spec/core/scope_spec.moon
+++ b/spec/core/scope_spec.moon
@@ -1,10 +1,12 @@
-import Scope, Value, Op from require 'core'
+import Scope, Value, Result, Op from require 'core'
import Logger from require 'logger'
Logger.init 'silent'
class TestOp extends Op
new: (...) => super ...
+wrap_res = (value) -> Result :value
+
describe 'Scope', ->
describe 'constifies', ->
scope = Scope!
@@ -94,21 +96,63 @@ describe 'Scope', ->
assert.is.equal pi, (root\get 'deep/child/test')\const!
+ describe 'can set symbols', ->
+ one = wrap_res Value.num 1
+ two = wrap_res Value.num 2
+ scope = Scope!
+
+ it 'disallows re-setting symbols', ->
+ scope\set 'test', one
+ assert.is.equal one, scope\get 'test'
+
+ it 'throws if overwriting', ->
+ assert.has.error -> scope\set 'test', two
+ assert.is.equal one, scope\get 'test'
+
describe 'inheritance', ->
root = Scope!
root\set_raw 'hidden', 1234
root\set_raw 'inherited', "inherited string"
- scope = Scope nil, root
+ scope = Scope root
it 'allows access', ->
got = (scope\get 'inherited')\const!
assert.is.equal 'str', got.type
assert.is.equal "inherited string", got.value
- it 'can keep defs', ->
+ it 'can be shadowed', ->
scope\set_raw 'hidden', "overwritten"
got = (scope\get 'hidden')\const!
assert.is.equal 'str', got.type
assert.is.equal "overwritten", got.value
+
+ describe 'dynamic inheritance', ->
+ root = Scope!
+ dyn_root = Scope!
+
+ root\set_raw 'normal', 'normal'
+ root\set_raw '*dynamic*', 'normal'
+ dyn_root\set_raw 'normal', 'dynamic'
+ dyn_root\set_raw '*dynamic*', 'dynamic'
+
+ dyn_root\set_raw '*nested*', { value: 3 }
+
+ it 'follows a different parent', ->
+ merged = Scope root, dyn_root
+ assert.is.equal 'normal', (merged\get 'normal').value!
+ assert.is.equal 'dynamic', (merged\get '*dynamic*').value!
+
+ it 'falls back to the immediate parent', ->
+ merged = Scope root
+ assert.is.equal 'normal', (merged\get '*dynamic*').value!
+
+ it 'looks in self first', ->
+ merged = Scope root
+ merged\set_raw '*dynamic*', 'merged'
+ assert.is.equal 'merged', (merged\get '*dynamic*').value!
+
+ it 'can resolve nested', ->
+ merged = Scope root, dyn_root
+ assert.is.equal 3, (merged\get '*nested*/value').value!