diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2018-11-01 10:17:55 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2018-11-01 10:17:55 +0000 |
| commit | 30fb0dc40d595b9e0b7747ad8e5c4e8cf7e3023b (patch) | |
| tree | dc56f20ec4d78115e15761c402589b5aec94ef55 /root/meta | |
| parent | defer all scripts (diff) | |
| download | mmm-30fb0dc40d595b9e0b7747ad8e5c4e8cf7e3023b.tar.gz mmm-30fb0dc40d595b9e0b7747ad8e5c4e8cf7e3023b.zip | |
move mmm code from lib to mmm etc
Diffstat (limited to 'root/meta')
| -rw-r--r-- | root/meta/init.moon | 27 | ||||
| -rw-r--r-- | root/meta/test_component.moon | 224 | ||||
| -rw-r--r-- | root/meta/todo.moon | 42 |
3 files changed, 293 insertions, 0 deletions
diff --git a/root/meta/init.moon b/root/meta/init.moon new file mode 100644 index 0000000..cd2baed --- /dev/null +++ b/root/meta/init.moon @@ -0,0 +1,27 @@ +import div, h3, ul, li, a from require 'mmm.dom' +import define_fileders from require 'mmm.mmmfs' +Fileder = define_fileders ... +require = relative ... + +Fileder { + 'name: alpha': 'meta', + 'title: text/plain': 'about mmm', + 'moon -> mmm/dom': (path) => div { + h3 @gett 'title: text/plain', style: { 'margin-bottom': '-.5em' }, + ul for child in *@children + name = child\gett 'name: alpha' + desc = child\gett 'description: text/plain' + li { + a name, { + href: child.path, + onclick: (e) => + e\preventDefault! + BROWSER\navigate child.path + }, + ': ', desc + } + } + + require '.todo' + require '.test_component' +} diff --git a/root/meta/test_component.moon b/root/meta/test_component.moon new file mode 100644 index 0000000..c1c766e --- /dev/null +++ b/root/meta/test_component.moon @@ -0,0 +1,224 @@ +import define_fileders from require 'mmm.mmmfs' +Fileder = define_fileders ... + +Fileder { + 'name: alpha': 'mmm.component_test' + 'description: text/plain': 'Tests for mmm.component' + 'moon -> mmm/dom': => + import article, div, h1, ul, li, pre from require 'mmm.dom' + + _content = {} + append = (stuff) -> table.insert _content, stuff + + last = nil + test_group = (name) -> + if last + append div (h1 name), ul last + + last = {} + (name, test) -> + ok, err = pcall test + table.insert last, li if ok + "passed '#{name}'" + else + "failed '#{name}'", pre err + + expect = (expected, note, ...) -> + ok, msg = pcall ... + print ok, msg\find expected + if ok or not msg\find expected + error note + + run_test = test_group 'component.moon' + + local ReactiveVar, ReactiveElement + run_test "exports ReactiveVar, ReactiveElement", -> + import ReactiveVar, ReactiveElement from require 'mmm.component' + assert ReactiveVar, "ReactiveVar not exported" + assert ReactiveElement, "ReactiveElement not exported" + + run_test "exports tohtml helper", -> + import tohtml from require 'mmm.component' + assert 'function' == (type tohtml), "tohtml not exported" + + -- @TODO: get_or_create + + run_test "exports text helper", -> + import text from require 'mmm.component' + assert 'function' == (type text), "text not exported" + + node = text 'a test string' + assert (js.instanceof node, js.global.Node), "expected text to generate a Node" + assert node.data == 'a test string', "expected text to store the string" + + run_test "text joins multiple arguments", -> + import text from require 'mmm.component' + + node = text 'a', 'test', 'string' + assert node.data == 'a test string', "expected text to join arguments with spaces" + + run_test "exports elements table", -> + import elements from require 'mmm.component' + + assert (type elements.div!) == 'table', "expected to build element with elements.div!" + assert (type elements.madeup!) == 'table', "expected to build element with elements.madeup!" + + run_test = test_group 'ReactiveVar' + + run_test "stores a value", -> + reactive = ReactiveVar 'test' + assert 'test' == reactive\get!, "expected x to be 'test'" + + run_test "propagates updates", -> + local done + + reactive = ReactiveVar 'test' + reactive\subscribe coroutine.wrap (next) -> + assert next == 'toast', "expected next to be 'toast'" + assert coroutine.yield! == 'cheese', "expected next to be 'cheese'" + done = true + + reactive\set 'toast' + assert 'toast' == reactive\get!, "expected #get to return 'toast'" + reactive\set 'cheese' + assert done, "expected to reach the end" + + run_test "passed old value as well", -> + local done + + reactive = ReactiveVar 1 + reactive\subscribe coroutine.wrap (next, last) -> + assert last == 1, "expected last:1 to be 1" + next, last = coroutine.yield! + assert last == 2, "expected last:2 to be 2" + done = true + + reactive\set 2 + reactive\set 3 + assert done, "expected to reach the end" + + run_test "provides transform shorthand", -> + local done + + reactive = ReactiveVar 1 + reactive\subscribe coroutine.wrap (next, last) -> + assert last == 1, "expected last:1 to be 1" + next, last = coroutine.yield! + assert last == 2, "expected last:2 to be 2" + done = true + + add_one = (a) -> a + 1 + reactive\transform add_one + reactive\transform add_one + assert done, "expected to reach the end" + + run_test "#subscribe returns function to unsubscribe", -> + calls = 0 + + reactive = ReactiveVar 1 + unsub = reactive\subscribe coroutine.wrap () -> + calls += 1 + coroutine.yield! + calls += 1 + coroutine.yield! + calls += 1 + + assert 'function' == (type unsub), "expected to receive a function" + + reactive\set 2 + reactive\set 3 + assert calls == 2, "wat" + + unsub! + reactive\set 4 + assert calls == 2, "expected to stop receiving updates" + + run_test "tracks multiple subscriptions at once", -> + reactive = ReactiveVar 'test' + unsub = reactive\subscribe coroutine.wrap (next) -> + assert next == 'toast', "expected next to be toast" + next = coroutine.yield! + assert next == 'cheese', "expected next to be cheese" + coroutine.yield! + error "expected not to get here" + + reactive\set 'toast' + + local done + reactive\subscribe coroutine.wrap (next) -> + assert next == 'cheese', "expected next to be cheese" + next = coroutine.yield! + assert next == 'test', "expected next to be test" + done = true + + reactive\set 'cheese' + unsub! + reactive\set 'test' + assert done, "expected to reach the end" + + run_test = test_group 'ReactiveElement' + + run_test "creates a HTML element", -> + elem = ReactiveElement 'span' + assert elem.node and elem.node.localName == 'span', "expected Node to be a <span>" + + -- @TODO: can take over a DOM Node + + run_test "sets attributes from a table arg", -> + elem = ReactiveElement 'span', class: 'never' + assert elem.node.class == 'never', "expected class to be 'never'" + + run_test "appends Nodes from arguments", -> + e_div, e_pre = div!, pre! + elem = ReactiveElement 'span', e_div, e_pre + assert elem.node.firstElementChild == e_div, "expected div to be the first child of elem" + assert elem.node.lastElementChild == e_pre, "expected pre to be the last child of elem" + + run_test "can append ReactiveElements and text", -> + e_div = ReactiveElement 'div' + elem = ReactiveElement 'div', e_div, 'testtext' + assert elem.node.firstElementChild == e_div.node, "expected div to be the first child of elem" + assert elem.node.lastChild.data == 'testtext', "expected last child of elem to be 'testtext'" + + run_test "accepts attributes after children", -> + e_div = div! + elem = ReactiveElement 'div', e_div, class: 'test' + assert elem.node.firstElementChild == e_div, "expected div to be the first child of elem" + assert elem.node.class == 'test', "expected class to be 'test'" + + run_test "allows mixing attributes and children in a single table", -> + e_div, e_pre = div!, pre! + elem = ReactiveElement 'div', { class: 'test', e_div, e_pre } + assert elem.node.firstElementChild == e_div, "expected div to be the first child of elem" + assert elem.node.lastElementChild == e_pre, "expected pre to be the last child of elem" + assert elem.node.class == 'test', "expected class to be 'test'" + + run_test "can unwrap and track attributes from ReactiveVars", -> + klass = ReactiveVar 'test' + elem = ReactiveElement 'div', class: klass + assert elem.node.class == 'test', "expected class to be 'test'" + klass\set 'toast' + assert elem.node.class == 'toast', "expected class to be 'toast'" + + run_test "can unwrap and track children from ReactiveVars", -> + child = ReactiveVar h1 'test' + elem = ReactiveElement 'div', child, pre 'fixed' + assert elem.node.firstElementChild.localName == 'h1', "expected first child to be h1" + assert elem.node.childElementCount == 2, "expected node to have two children" + child\set div 'toast' + assert elem.node.firstElementChild.localName == 'div', "expected first child to be div" + assert elem.node.childElementCount == 2, "expected node to have two children" + + run_test "warns when appending a string from a ReactiveVar", -> + import text from require 'mmm.component' + + str = ReactiveVar 'test' + elem = ReactiveElement 'div', str + expect 'cannot replace string node', 'expected error', str\set, 'string too' + elem\destroy! + + elem = ReactiveElement 'div', str\map text + str\set 'this is text' + + article _content +} diff --git a/root/meta/todo.moon b/root/meta/todo.moon new file mode 100644 index 0000000..eb6fc0d --- /dev/null +++ b/root/meta/todo.moon @@ -0,0 +1,42 @@ +import define_fileders from require 'mmm.mmmfs' +Fileder = define_fileders ... + +Fileder { + 'name: alpha': 'todo' + 'description: text/plain': 'TodoMVC using mmm.component' + 'moon -> mmm/component': => + import ReactiveVar, text, elements from require 'mmm.component' + import article, div, form, span, h3, a, input, textarea, button from elements + + parent = div! + todoItem = (desc, done) -> + -- convert into reactive data sources + desc, done = (ReactiveVar desc), ReactiveVar done + with me = div style: + margin: '8px' + padding: '8px' + background: '#eeeeee' + \append h3 (desc\map text), style: 'margin: 0;' + \append span done\map (done) -> text if done then 'done' else 'not done yet' + \append input type: 'checkbox', checked: done, onchange: (e) => done\set e.target.checked + \append a (text 'delete'), href: '#', onclick: (e) => parent\remove me + + parent\append todoItem 'write a Component System', true + parent\append todoItem 'eat Lasagna', true + parent\append todoItem 'do other things' + + desc = ReactiveVar 'start' + form = with form { + action: '' + style: + margin: '2px' + onsubmit: (e) => + e\preventDefault! + parent\append todoItem desc\get! + desc\set '' + } + \append input type: 'text', value: desc, onchange: (e) => desc\set e.target.value + \append input type: 'submit', value: 'add' + + article parent, form +} |
