Skip to content

Commit a5fb855

Browse files
authored
Merge pull request elixirscript#442 from elixirscript/additional-test-features
Add more test assertions. Make behaviour for test runners
2 parents d9392d2 + 8e1b987 commit a5fb855

6 files changed

Lines changed: 251 additions & 66 deletions

File tree

lib/elixir_script/compiler.ex

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ defmodule ElixirScript.Compiler do
2323
If a directory is given, file will be named `elixirscript.build.js`
2424
2525
* `root`: Optional root for imports of FFI JavaScript modules. Defaults to `.`.
26-
* `remove_unused_functions`: Removed unused functions in output. Defaults to
27-
removing unused functions when Mix.env == :prod
2826
"""
2927
alias ElixirScript.{
3028
State,

lib/elixir_script_test/test.ex

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,8 @@ defmodule ElixirScript.Test do
7474

7575
defmacro __using__(_opts) do
7676
quote do
77-
import ElixirScript.Test.Callbacks, only: [
78-
test: 2, test: 3,
79-
setup: 1, setup: 2,
80-
setup_all: 1, setup_all: 2,
81-
teardown: 1, teardown: 2,
82-
teardown_all: 1, teardown_all: 2,
83-
assert: 1, assert: 2
84-
]
77+
require ExUnit.Assertions
78+
import ElixirScript.Test.{Callbacks, Assertions}
8579

8680
def __elixirscript_test_module__, do: true
8781
end
@@ -102,10 +96,10 @@ defmodule ElixirScript.Test do
10296
|> Path.join("Elixir.*.js")
10397
|> Path.wildcard()
10498

105-
exit_status = node_test_runner(js_files)
99+
exit_status = ElixirScript.Test.Runner.Node.run(js_files)
106100

107101
# Delete directory at the end
108-
# File.rm_rf!(output)
102+
File.rm_rf!(output)
109103

110104
case exit_status do
111105
0 ->
@@ -114,16 +108,4 @@ defmodule ElixirScript.Test do
114108
:error
115109
end
116110
end
117-
118-
defp node_test_runner(js_files) do
119-
test_script_path = Path.join([:code.priv_dir(:elixir_script), "testrunner", "index.js"])
120-
test_script_path = [test_script_path] ++ js_files
121-
{_, exit_status} = System.cmd(
122-
"node",
123-
test_script_path,
124-
into: IO.stream(:stdio, :line)
125-
)
126-
127-
exit_status
128-
end
129111
end
Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
defmodule ElixirScript.Test.Assertions do
2+
@moduledoc """
3+
Defines assertions for use in ElixirScript test.
4+
These are a subset of [ExUnit.Assertions](https://hexdocs.pm/ex_unit/ExUnit.Assertions.html)
5+
"""
6+
7+
@doc false
8+
def raise_elixir_script_assert(error, file, line) do
9+
reraise(ElixirScript.Test.AssertionError, [
10+
left: error.left,
11+
right: error.right,
12+
message: error.message,
13+
expr: error.expr,
14+
file: file,
15+
line: line
16+
], [])
17+
end
18+
19+
@doc """
20+
Asserts its argument is a truthy value
21+
"""
22+
defmacro assert(assertion) do
23+
%{file: file, line: line} = __CALLER__
24+
25+
quote [file: file, line: line] do
26+
try do
27+
ExUnit.Assertions.assert(unquote(assertion))
28+
rescue
29+
error in [ExUnit.AssertionError] ->
30+
ElixirScript.Test.Assertions.raise_elixir_script_assert(
31+
error,
32+
unquote(file),
33+
unquote(line)
34+
)
35+
end
36+
end
37+
end
38+
39+
@doc """
40+
Asserts `value` is `true`, displaying the given `message` otherwise.
41+
"""
42+
defmacro assert(value, message) do
43+
%{file: file, line: line} = __CALLER__
44+
45+
quote [file: file, line: line] do
46+
try do
47+
ExUnit.Assertions.assert(unquote(value), unquote(message))
48+
rescue
49+
error in [ExUnit.AssertionError] ->
50+
ElixirScript.Test.Assertions.raise_elixir_script_assert(
51+
error,
52+
unquote(file),
53+
unquote(line)
54+
)
55+
end
56+
end
57+
end
58+
59+
@doc """
60+
Asserts the `exception` is raised during `function` execution.
61+
Returns the rescued exception, fails otherwise.
62+
"""
63+
defmacro assert_raise(exception, function) do
64+
%{file: file, line: line} = __CALLER__
65+
66+
quote [file: file, line: line] do
67+
try do
68+
ExUnit.Assertions.assert(unquote(exception), unquote(function))
69+
rescue
70+
error in [ExUnit.AssertionError] ->
71+
ElixirScript.Test.Assertions.raise_elixir_script_assert(
72+
error,
73+
unquote(file),
74+
unquote(line)
75+
)
76+
end
77+
end
78+
end
79+
80+
@doc """
81+
Asserts the `exception` is raised during `function` execution with
82+
the expected `message`, which can be a `Regex` or an exact `String`.
83+
Returns the rescued exception, fails otherwise.
84+
"""
85+
defmacro assert_raise(exception, message, function) do
86+
%{file: file, line: line} = __CALLER__
87+
88+
quote [file: file, line: line] do
89+
try do
90+
ExUnit.Assertions.assert(
91+
unquote(exception),
92+
unquote(message),
93+
unquote(function)
94+
)
95+
rescue
96+
error in [ExUnit.AssertionError] ->
97+
ElixirScript.Test.Assertions.raise_elixir_script_assert(
98+
error,
99+
unquote(file),
100+
unquote(line)
101+
)
102+
end
103+
end
104+
end
105+
106+
@doc """
107+
Asserts that `value1` and `value2` differ by no more than `delta`
108+
"""
109+
defmacro assert_in_delta(value1, value2, delta, message \\ nil) do
110+
%{file: file, line: line} = __CALLER__
111+
112+
quote [file: file, line: line] do
113+
try do
114+
ExUnit.Assertions.assert_in_delta(
115+
unquote(value1),
116+
unquote(value2),
117+
unquote(delta),
118+
unquote(message)
119+
)
120+
rescue
121+
error in [ExUnit.AssertionError] ->
122+
ElixirScript.Test.Assertions.raise_elixir_script_assert(
123+
error,
124+
unquote(file),
125+
unquote(line)
126+
)
127+
end
128+
end
129+
end
130+
131+
@doc """
132+
A negative assertion, expects the expression to be `false` or `nil`.
133+
"""
134+
defmacro refute(assertion) do
135+
%{file: file, line: line} = __CALLER__
136+
137+
quote [file: file, line: line] do
138+
try do
139+
ExUnit.Assertions.assert(unquote(assertion))
140+
rescue
141+
error in [ExUnit.AssertionError] ->
142+
ElixirScript.Test.Assertions.raise_elixir_script_assert(
143+
error,
144+
unquote(file),
145+
unquote(line)
146+
)
147+
end
148+
end
149+
end
150+
151+
@doc """
152+
Asserts `value` is `nil` or `false` (that is, `value` is not truthy).
153+
"""
154+
defmacro refute(value, message) do
155+
%{file: file, line: line} = __CALLER__
156+
157+
quote [file: file, line: line] do
158+
try do
159+
ExUnit.Assertions.assert(unquote(value), unquote(message))
160+
rescue
161+
error in [ExUnit.AssertionError] ->
162+
ElixirScript.Test.Assertions.raise_elixir_script_assert(
163+
error,
164+
unquote(file),
165+
unquote(line)
166+
)
167+
end
168+
end
169+
end
170+
171+
@doc """
172+
Asserts that `value1` and `value2` are not within `delta`
173+
"""
174+
defmacro refute_in_delta(value1, value2, delta, message \\ nil) do
175+
%{file: file, line: line} = __CALLER__
176+
177+
quote [file: file, line: line] do
178+
try do
179+
ExUnit.Assertions.refute_in_delta(
180+
unquote(value1),
181+
unquote(value2),
182+
unquote(delta),
183+
unquote(message)
184+
)
185+
rescue
186+
error in [ExUnit.AssertionError] ->
187+
ElixirScript.Test.Assertions.raise_elixir_script_assert(
188+
error,
189+
unquote(file),
190+
unquote(line)
191+
)
192+
end
193+
end
194+
end
195+
196+
@doc """
197+
Fails with a message.
198+
"""
199+
defmacro flunk(message \\ "Flunked!") do
200+
%{file: file, line: line} = __CALLER__
201+
202+
quote [file: file, line: line] do
203+
try do
204+
ExUnit.Assertions.flunk(unquote(message))
205+
rescue
206+
error in [ExUnit.AssertionError] ->
207+
ElixirScript.Test.Assertions.raise_elixir_script_assert(
208+
error,
209+
unquote(file),
210+
unquote(line)
211+
)
212+
end
213+
end
214+
end
215+
end

lib/elixir_script_test/test/callbacks.ex

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -114,46 +114,4 @@ defmodule ElixirScript.Test.Callbacks do
114114
end
115115
end
116116
end
117-
118-
defmacro assert(assertion) do
119-
%{file: file, line: line} = __CALLER__
120-
121-
quote [file: file, line: line] do
122-
require ExUnit.Assertions
123-
try do
124-
ExUnit.Assertions.assert(unquote(assertion))
125-
rescue
126-
x in [ExUnit.AssertionError] ->
127-
reraise(ElixirScript.Test.AssertionError, [
128-
left: x.left,
129-
right: x.right,
130-
message: x.message,
131-
expr: x.expr,
132-
file: unquote(file),
133-
line: unquote(line)
134-
], [])
135-
end
136-
end
137-
end
138-
139-
defmacro assert(value, message) do
140-
%{file: file, line: line} = __CALLER__
141-
142-
quote [file: file, line: line] do
143-
require ExUnit.Assertions
144-
try do
145-
ExUnit.Assertions.assert(unquote(value), unquote(message))
146-
rescue
147-
x in [ExUnit.AssertionError] ->
148-
reraise(ElixirScript.Test.AssertionError, [
149-
left: x.left,
150-
right: x.right,
151-
message: x.message,
152-
expr: x.expr,
153-
file: unquote(file),
154-
line: unquote(line)
155-
], [])
156-
end
157-
end
158-
end
159117
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
defmodule ElixirScript.Test.Runner do
2+
@moduledoc """
3+
Defines a behaviour for an ElixirScript Test runner
4+
"""
5+
6+
@doc """
7+
Callback for running the test runner.
8+
Receives a list of JavaScript files from the
9+
compiled Elixir code. Expects an exit status
10+
representing the success or failure of the
11+
tests
12+
"""
13+
@callback run([binary]) :: integer
14+
end
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
defmodule ElixirScript.Test.Runner.Node do
2+
@moduledoc """
3+
Defines an ElixirScript Test runner using node
4+
"""
5+
@behaviour ElixirScript.Test.Runner
6+
7+
def run(js_files) do
8+
test_script_path = Path.join([:code.priv_dir(:elixir_script), "testrunner", "index.js"])
9+
test_script_path = [test_script_path] ++ js_files
10+
{_, exit_status} = System.cmd(
11+
"node",
12+
test_script_path,
13+
into: IO.stream(:stdio, :line)
14+
)
15+
16+
exit_status
17+
end
18+
end

0 commit comments

Comments
 (0)