diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2020-03-15 12:38:00 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2020-03-15 12:38:00 +0000 |
| commit | 23f893a1303b35e11d7103d892c40b7e8d209a06 (patch) | |
| tree | 768db1660b0fe00c711a1b54f0e3297c24732164 | |
| parent | docs/guide: runtime description (diff) | |
| download | alive-23f893a1303b35e11d7103d892c40b7e8d209a06.tar.gz alive-23f893a1303b35e11d7103d892c40b7e8d209a06.zip | |
add Input spec
Close #8
| -rw-r--r-- | core/base/input.moon | 6 | ||||
| -rw-r--r-- | core/registry.moon | 4 | ||||
| -rw-r--r-- | spec/core/input_spec.moon | 204 |
3 files changed, 211 insertions, 3 deletions
diff --git a/core/base/input.moon b/core/base/input.moon index dae5b43..c89337f 100644 --- a/core/base/input.moon +++ b/core/base/input.moon @@ -119,8 +119,10 @@ class ColdInput extends Input class ValueInput extends Input setup: (old) => @dirty_setup = not old or @stream != old.stream - finish_setup: => @dirty_setup = false - dirty: => @dirty_setup or @stream\dirty! + finish_setup: => @dirty_setup = nil + dirty: => + return @dirty_setup if @dirty_setup != nil + @stream\dirty! class EventInput extends Input diff --git a/core/registry.moon b/core/registry.moon index 374337a..9627447 100644 --- a/core/registry.moon +++ b/core/registry.moon @@ -99,8 +99,10 @@ class Registry class SimpleRegistry extends Registry new: => @cnt = 1 + @tick = 0 - tick: 0 + next_tick: => + @tick += 1 init: (tag, expr) => tag\set @cnt diff --git a/spec/core/input_spec.moon b/spec/core/input_spec.moon new file mode 100644 index 0000000..e2ec7e3 --- /dev/null +++ b/spec/core/input_spec.moon @@ -0,0 +1,204 @@ +import Input, Result, Value, IO from require 'core.base' +import SimpleRegistry from require 'core' +import Logger from require 'logger' +Logger.init 'silent' + +reg = SimpleRegistry! +setup -> reg\grab! +teardown -> reg\release! + +describe 'Input.event', -> + val = Value.num 1 + input = Input.event val + + describe 'at evaltime', -> + it 'follows Value when new', -> + input\setup nil + + val\set 2 + assert.is.true val\dirty! + assert.is.true input\dirty! + + reg\next_tick! + assert.is.false val\dirty! + assert.is.false input\dirty! + + input\finish_setup! + + it 'follows Value when different', -> + new_input = Input.event Value.num 3 + new_input\setup input + + assert.is.false new_input.stream\dirty! + assert.is.false new_input\dirty! + + new_input.stream\set 3 + assert.is.true new_input.stream\dirty! + assert.is.true new_input\dirty! + + reg\next_tick! + new_input\finish_setup! + + it 'follows Value when equal', -> + new_input = Input.event Value.num 2 + new_input\setup input + + assert.is.false new_input.stream\dirty! + assert.is.false new_input\dirty! + + new_input.stream\set 2 + assert.is.true new_input.stream\dirty! + assert.is.true new_input\dirty! + + describe 'at runtime', -> + it 'is dirty when the value is dirty', -> + val\set 3 + assert.is.true val\dirty! + assert.is.true input\dirty! + + reg\next_tick! + assert.is.false val\dirty! + assert.is.false input\dirty! + + it 'unwraps to the lua value', -> + assert.is.equal 3, input\unwrap! + assert.is.equal 3, input! + + it 'gives access to the type string', -> + assert.is.equal 'num', input\type! + + it 'gives access to the Value', -> + assert.is.equal val, input.stream + +describe 'Input.value', -> + val = Value.num 1 + local input + + describe 'at evaltime', -> + it 'is dirty when new', -> + assert.is.false val\dirty! + + input = Input.value val + input\setup nil + assert.is.true input\dirty! + input\finish_setup! + + it 'is dirty when different', -> + newval = Value.num 2 + + assert.is.false newval\dirty! + newinput = Input.value newval + newinput\setup input + assert.is.true newinput\dirty! + newinput\finish_setup! + + it 'is not dirty when equal', -> + newval = Value.num 1 + newval\set 1 + + assert.is.true newval\dirty! + newinput = Input.value newval + newinput\setup input + assert.is.false newinput\dirty! + newinput\finish_setup! + + describe 'at runtime', -> + it 'is dirty when the value is dirty', -> + val\set 3 + assert.is.true val\dirty! + assert.is.true input\dirty! + + reg\next_tick! + assert.is.false val\dirty! + assert.is.false input\dirty! + + it 'unwraps to the lua value', -> + assert.is.equal 3, input\unwrap! + assert.is.equal 3, input! + + it 'gives access to the type string', -> + assert.is.equal 'num', input\type! + + it 'gives access to the Value', -> + assert.is.equal val, input.stream + +describe 'Input.cold', -> + val = Value.num 1 + input = Input.cold val + + it 'is never dirty', -> + assert.is.false input\dirty! + val\set 2 + assert.is.false input\dirty! + + input\setup nil + assert.is.false input\dirty! + input\finish_setup! + + new_input = Input.cold Value.num 3 + new_input\setup input + assert.is.false new_input\dirty! + new_input.stream\set 4 + assert.is.false new_input\dirty! + input\finish_setup! + + it 'unwraps to the lua value', -> + assert.is.equal 2, input\unwrap! + assert.is.equal 2, input! + + it 'gives access to the type string', -> + assert.is.equal 'num', input\type! + + it 'gives access to the Value', -> + assert.is.equal val, input.stream + +class MyIO extends IO + dirty: => @is_dirty + +describe 'Input.io', -> + io = MyIO! + val = Value 'test-io', io + input = Input.io val + + it 'is dirty when the IO is dirty', -> + io.is_dirty = false + + assert.is.false val\dirty! + assert.is.false input\dirty! + assert.is.false io\dirty! + + input\setup nil + assert.is.false input\dirty! + input\finish_setup! + + val\set io + assert.is.true val\dirty! + assert.is.false input\dirty! + assert.is.false io\dirty! + + reg\next_tick! + + io.is_dirty = true + + assert.is.false val\dirty! + assert.is.true input\dirty! + assert.is.true io\dirty! + + input\setup nil + assert.is.true input\dirty! + input\finish_setup! + + val\set io + assert.is.true val\dirty! + assert.is.true input\dirty! + assert.is.true io\dirty! + + it 'unwraps to the io value', -> + assert.is.equal io, input\unwrap! + assert.is.equal io, input! + + it 'gives access to the type string', -> + assert.is.equal 'test-io', input\type! + + it 'gives access to the Value', -> + assert.is.equal val, input.stream |
