Skip to content
This repository has been archived by the owner on Aug 23, 2018. It is now read-only.

Commit

Permalink
Add test scripts and tests for lazy function.
Browse files Browse the repository at this point in the history
  • Loading branch information
laszlopandy committed Sep 14, 2015
1 parent 1fc7140 commit cdb80e8
Show file tree
Hide file tree
Showing 8 changed files with 235 additions and 1 deletion.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
node_modules
elm-stuff
elm-stuff
tests/build
32 changes: 32 additions & 0 deletions tests/Native/TestHelpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
Elm.Native.TestHelpers = {};
Elm.Native.TestHelpers.make = function(localRuntime)
{
localRuntime.Native = localRuntime.Native || {};
localRuntime.Native.TestHelpers = localRuntime.Native.TestHelpers || {};
if (localRuntime.Native.TestHelpers.values)
{
return localRuntime.Native.TestHelpers.values;
}

function unsafeRecordCallCount(f) {
function wrapper(a) {
wrapper.__elm_test_call_count += 1;
return f(a);
}
wrapper.__elm_test_call_count = 0;
return wrapper;
}

function unsafeQueryCallCount(f) {
if (f.__elm_test_call_count === undefined) {
return -1;
}
return f.__elm_test_call_count;
}

Elm.Native.TestHelpers.values = {
unsafeRecordCallCount: unsafeRecordCallCount,
unsafeQueryCallCount: unsafeQueryCallCount
};
return localRuntime.Native.TestHelpers.values = Elm.Native.TestHelpers.values;
};
74 changes: 74 additions & 0 deletions tests/TestCases/Lazy.elm
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
module TestCases.Lazy where

import VirtualDom exposing (Node, lazy)
import ElmTest.Assertion exposing (assertEqual)
import ElmTest.Test exposing (Test, suite, test)

import TestHelpers exposing (forceRenderDom, unsafeRecordCallCount, unsafeQueryCallCount)

renderRecord : { x: String, y: String } -> Node
renderRecord r =
VirtualDom.text <| "The values: " ++ r.x ++ ", " ++ r.y


renderPrimitive : Int -> Node
renderPrimitive x =
VirtualDom.text <| "The value: " ++ (toString x)


testLazyIdenticalRecord =
test "isn't called again with identical record" <|
let record = { x = "a", y = "b" }
wrappedRender = unsafeRecordCallCount renderRecord
lazyRender = lazy wrappedRender
call1 = forceRenderDom <| lazyRender record
call2 = forceRenderDom <| lazyRender record
call3 = forceRenderDom <| lazyRender record
in
assertEqual 1 <| unsafeQueryCallCount wrappedRender


testLazyIdenticalPrimitive =
test "isn't called again with identical primitive" <|
let wrappedRender = unsafeRecordCallCount renderPrimitive
lazyRender = lazy wrappedRender
call1 = forceRenderDom <| lazyRender 5
call2 = forceRenderDom <| lazyRender 5
call3 = forceRenderDom <| lazyRender 5
in
assertEqual 1 <| unsafeQueryCallCount wrappedRender


testLazyRecordMutationOfIdenticalValue =
test "isn't called again with record mutation of identical value" <|
let record = { x = "a", y = "b" }
wrappedRender = unsafeRecordCallCount renderRecord
lazyRender = lazy wrappedRender
call1 = forceRenderDom <| lazyRender record
call2 = forceRenderDom <| lazyRender { record | x <- "a" }
call3 = forceRenderDom <| lazyRender { record | x <- "a", y <- "b" }
in
assertEqual 1 <| unsafeQueryCallCount wrappedRender


testNotLazyDifferentRecord =
test "is called again with an equivalent but different record" <|
let wrappedRender = unsafeRecordCallCount renderRecord
lazyRender = lazy wrappedRender
call1 = forceRenderDom <| lazyRender { x = "a", y = "b" }
call2 = forceRenderDom <| lazyRender { x = "a", y = "b" }
call3 = forceRenderDom <| lazyRender { x = "a", y = "b" }
in
assertEqual 3 <| unsafeQueryCallCount wrappedRender


tests : Test
tests =
suite
"Lazy"
[
testLazyIdenticalRecord,
testLazyIdenticalPrimitive,
testLazyRecordMutationOfIdenticalValue,
testNotLazyDifferentRecord
]
20 changes: 20 additions & 0 deletions tests/TestHelpers.elm
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module TestHelpers where

import VirtualDom exposing (Node)

import Native.TestHelpers
import Native.VirtualDom

unsafeRecordCallCount : (a -> b) -> (a -> b)
unsafeRecordCallCount =
Native.TestHelpers.unsafeRecordCallCount

unsafeQueryCallCount : (a -> b) -> Int
unsafeQueryCallCount =
Native.TestHelpers.unsafeQueryCallCount

type OpaqueDom = OpaqueDom

forceRenderDom : Node -> OpaqueDom
forceRenderDom =
Native.VirtualDom.render
24 changes: 24 additions & 0 deletions tests/TestMain.elm
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@

import ElmTest.Runner.Console exposing (runDisplay)
import ElmTest.Test exposing (Test, suite)
import IO.IO exposing (IO)
import IO.Runner exposing (Request, Response)
import IO.Runner as Run

import TestCases.Lazy

tests : Test
tests =
suite
"VirtualDom Library Tests"
[
TestCases.Lazy.tests
]

console : IO ()
console = runDisplay tests

port requests : Signal Request
port requests = Run.run responses console

port responses : Signal Response
43 changes: 43 additions & 0 deletions tests/elm-io-ports.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/* Implementation from: https://raw.githubusercontent.com/maxsnew/IO/master/elm-io.sh */
(function() {
var stdin = process.stdin;
var fs = require('fs');
var worker = Elm.worker(Elm.Main, {responses: null });
var just = function(v) {
return { 'Just': v};
};
var handle = function(request) {
switch (request.ctor) {
case 'Put':
process.stdout.write(request.val);
break;
case 'Get':
stdin.resume();
break;
case 'Exit':
process.exit(request.val);
break;
case 'WriteFile':
fs.writeFileSync(request.file, request.content);
break;
}
};
var handler = function(reqs) {
for (var i = 0; i < reqs.length; i++) {
handle(reqs[i]);
}
if (reqs.length > 0 && reqs[reqs.length - 1].ctor !== 'Get') {
worker.ports.responses.send(just(''));
}
};
worker.ports.requests.subscribe(handler);

// Read
stdin.on('data', function(chunk) {
stdin.pause();
worker.ports.responses.send(just(chunk.toString()));
});

// Start msg
worker.ports.responses.send(null);
})();
18 changes: 18 additions & 0 deletions tests/elm-package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"version": "1.0.0",
"summary": "Test for VirtualDom",
"license": "BSD3",
"repository": "https://github.com/evancz/virtual-dom.git",
"exposed-modules": [],
"source-directories": [
".",
"build/virtual-dom/"
],
"native-modules": true,
"dependencies": {
"elm-lang/core": "2.1.0 <= v < 3.0.0",
"maxsnew/IO": "1.0.0 <= v < 2.0.0",
"deadfoxygrandpa/Elm-Test": "1.0.3 <= v < 2.0.0"
},
"elm-version": "0.15.1 <= v < 0.16.0"
}
22 changes: 22 additions & 0 deletions tests/run-tests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/bin/sh

set -e

mkdir -p build/virtual-dom/Native
cp ../src/VirtualDom.elm build/virtual-dom/
$(npm bin)/browserify ../src/wrapper.js -o build/VirtualDom.browser.js

set +e
diff -u ../src/Native/VirtualDom.js build/VirtualDom.browser.js
if [ $? != 0 ]; then
echo "ERROR:"
echo "src/Native/VirtualDom.js has local modifications or is out of date. Please run rebuild.sh"
exit 1
fi
set -e

$(npm bin)/browserify --no-browser-field ../src/wrapper.js -o build/virtual-dom/Native/VirtualDom.js

elm-make --yes --output build/test.js TestMain.elm
cat elm-io-ports.js >> build/test.js
node build/test.js

0 comments on commit cdb80e8

Please sign in to comment.