smlspec 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +16 -2
- data/README.md +43 -1
- data/Rakefile +2 -0
- data/TODO.md +21 -4
- data/bin/smlspec +23 -13
- data/build/smlspec-0.0.4.gem +0 -0
- data/features/running_tests.feature +20 -0
- data/features/step_definitions/smlspec_steps.rb +54 -0
- data/features/support/env.rb +2 -0
- data/lib/formats_tests.rb +2 -2
- data/lib/looks_for_mosml.rb +12 -0
- data/lib/test.rb +24 -0
- data/lib/test_output.rb +25 -0
- data/lib/test_output_presenter.rb +68 -0
- data/scripts/cucumber_init.sh +24 -0
- data/smlspec.gemspec +4 -1
- data/spec/fixtures/formatted_tests.sml +6 -6
- data/spec/looks_for_mosml_spec.rb +18 -0
- data/spec/spec_helper.rb +1 -14
- data/spec/support/helper_methods.rb +4 -0
- data/spec/{test_output_parser_spec.rb → test_output_presenter_spec.rb} +16 -14
- data/spec/test_output_spec.rb +39 -0
- data/spec/test_spec.rb +20 -0
- metadata +44 -3
- data/lib/test_output_parser.rb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6991ed75c5f26034f05f335944a7ddcd524b9dd
|
4
|
+
data.tar.gz: abceb8d8cce6a840c2d823821d1b57c3e0f43dc5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6a28ba4103305899aa80caa3938f584cca26106137f90394956eedd6b554c432914da159fa9b68a10c55b92ed259d99eaf550fff7efd290a80cdfa2d349f2c1
|
7
|
+
data.tar.gz: 1e8870d7795d9c5472d42164d28c69e00dc1e17201e70734c54631e0ba68f6e6d30054af0aea068d493a0d2a06e5bd2ebddf265ff336130e10006b4a55bd3188
|
data/CHANGELOG.md
ADDED
data/Gemfile.lock
CHANGED
@@ -1,13 +1,26 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
smlspec (0.0.
|
4
|
+
smlspec (0.0.5)
|
5
|
+
colorize
|
6
|
+
thor
|
5
7
|
|
6
8
|
GEM
|
7
9
|
remote: http://rubygems.org/
|
8
10
|
specs:
|
11
|
+
builder (3.2.2)
|
9
12
|
colorize (0.6.0)
|
13
|
+
cucumber (1.3.10)
|
14
|
+
builder (>= 2.1.2)
|
15
|
+
diff-lcs (>= 1.1.3)
|
16
|
+
gherkin (~> 2.12)
|
17
|
+
multi_json (>= 1.7.5, < 2.0)
|
18
|
+
multi_test (>= 0.0.2)
|
10
19
|
diff-lcs (1.2.5)
|
20
|
+
gherkin (2.12.2)
|
21
|
+
multi_json (~> 1.3)
|
22
|
+
multi_json (1.8.2)
|
23
|
+
multi_test (0.0.2)
|
11
24
|
rake (10.1.0)
|
12
25
|
rspec (2.14.1)
|
13
26
|
rspec-core (~> 2.14.0)
|
@@ -17,12 +30,13 @@ GEM
|
|
17
30
|
rspec-expectations (2.14.4)
|
18
31
|
diff-lcs (>= 1.1.3, < 2.0)
|
19
32
|
rspec-mocks (2.14.4)
|
33
|
+
thor (0.18.1)
|
20
34
|
|
21
35
|
PLATFORMS
|
22
36
|
ruby
|
23
37
|
|
24
38
|
DEPENDENCIES
|
25
|
-
|
39
|
+
cucumber
|
26
40
|
rake
|
27
41
|
rspec
|
28
42
|
smlspec!
|
data/README.md
CHANGED
@@ -1 +1,43 @@
|
|
1
|
-
#
|
1
|
+
# SMLspec
|
2
|
+
|
3
|
+
SML spec is a test runner for Standard ML. It lets you write very concise and short tests and still get a useful and pretty output.
|
4
|
+
|
5
|
+
## Install
|
6
|
+
|
7
|
+
1. Install [Moscow ML](https://github.com/kfl/mosml).
|
8
|
+
2. Install the gem with `gem install smlspec`.
|
9
|
+
|
10
|
+
## Example
|
11
|
+
|
12
|
+
Write some SML code like this
|
13
|
+
|
14
|
+
```sml
|
15
|
+
fun myLength [] = 0
|
16
|
+
| myLength (_::xs) = 1 + myLength xs
|
17
|
+
|
18
|
+
val myLength_test1 = myLength [] = 0
|
19
|
+
val myLength_test2 = myLength [1, 2] = 2
|
20
|
+
val myLength_test3 = myLength ["a", "b", "c"] = 3
|
21
|
+
```
|
22
|
+
|
23
|
+
Then run `smlspec <name of file>.sml`
|
24
|
+
|
25
|
+
And you'll get output similar to this
|
26
|
+
|
27
|
+
```
|
28
|
+
...
|
29
|
+
|
30
|
+
3 tests ran, 0 red, 3 green
|
31
|
+
```
|
32
|
+
|
33
|
+
If you have failed tests you'll see something like this
|
34
|
+
|
35
|
+
```
|
36
|
+
...F
|
37
|
+
|
38
|
+
|
39
|
+
myLength_test4
|
40
|
+
|
41
|
+
|
42
|
+
4 tests ran, 1 red, 3 green
|
43
|
+
```
|
data/Rakefile
CHANGED
@@ -4,11 +4,13 @@ RSpec::Core::RakeTask.new(:spec)
|
|
4
4
|
|
5
5
|
task default: :spec
|
6
6
|
|
7
|
+
desc 'Build gem'
|
7
8
|
task :build do
|
8
9
|
system "gem build smlspec.gemspec"
|
9
10
|
Dir.glob("*.gem") {|f| system "mv #{f} build" }
|
10
11
|
end
|
11
12
|
|
13
|
+
desc 'Install gem'
|
12
14
|
task :install do
|
13
15
|
system "gem uninstall smlspec"
|
14
16
|
newest_build = Dir.glob("build/*.gem").last
|
data/TODO.md
CHANGED
@@ -1,6 +1,23 @@
|
|
1
1
|
# TODOS
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
## For version 0.0.5
|
4
|
+
|
5
|
+
|
6
|
+
## Others
|
7
|
+
|
8
|
+
- [ ] make tests of SmlFile isolated, could be done using dependency injection
|
9
|
+
- [ ] allow for other implementations than moscow ml
|
10
|
+
- [ ] work with "load" function
|
11
|
+
- [ ] show time it took to run tests
|
12
|
+
- [ ] refactor binary
|
13
|
+
- [ ] clean up fixtures folder
|
14
|
+
|
15
|
+
## Done
|
16
|
+
|
17
|
+
- [x] append test function to file
|
18
|
+
- [x] write test output parser
|
19
|
+
- [x] make change log
|
20
|
+
- [x] refactor TestOutputParser
|
21
|
+
- [x] make some sort in integration test
|
22
|
+
- [x] test for mosml being installed when running binary
|
23
|
+
|
data/bin/smlspec
CHANGED
@@ -1,17 +1,24 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
$:.unshift("lib")
|
3
4
|
require 'colorize'
|
4
5
|
require 'digest/md5'
|
5
|
-
|
6
|
-
$:.unshift("lib")
|
7
6
|
require 'formats_lines'
|
8
7
|
require 'formats_tests'
|
9
8
|
require 'sml_file'
|
10
|
-
require '
|
9
|
+
require 'test_output'
|
10
|
+
require 'test'
|
11
|
+
require 'test_output_presenter'
|
12
|
+
require 'looks_for_mosml'
|
11
13
|
|
12
14
|
class Runner
|
13
15
|
def self.main(input)
|
14
|
-
|
16
|
+
if LooksForMosml.installed?
|
17
|
+
new(input)
|
18
|
+
else
|
19
|
+
puts "Moscow ML most be installed"
|
20
|
+
exit 1
|
21
|
+
end
|
15
22
|
end
|
16
23
|
|
17
24
|
def initialize(input)
|
@@ -20,16 +27,19 @@ class Runner
|
|
20
27
|
|
21
28
|
@file = SmlFile.new(@input).prepare_tests
|
22
29
|
|
23
|
-
|
30
|
+
tmp_file_name = random_name
|
24
31
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
32
|
+
@file.save_as!(tmp_file_name + ".sml")
|
33
|
+
|
34
|
+
@file.compile!(random_name + ".exe")
|
35
|
+
|
36
|
+
output = TestOutput.new(@file.run.split("\n"))
|
37
|
+
puts TestOutputPresenter.parse(output)
|
38
|
+
rescue SmlFile::CannotCompile => e
|
39
|
+
output = TestOutput.new(e.message.split("\n"))
|
40
|
+
puts TestOutputPresenter.parse(output).gsub(tmp_file_name+".sml", @input)
|
41
|
+
ensure
|
42
|
+
clean_up!
|
33
43
|
end
|
34
44
|
|
35
45
|
private
|
Binary file
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Feature: Running SML tests
|
2
|
+
In order to ensure that my SML is working
|
3
|
+
As a programmer
|
4
|
+
I want to be able to run tests
|
5
|
+
|
6
|
+
Scenario: Running tests
|
7
|
+
Given I have written an SML file with tests
|
8
|
+
When I run smlspec on the file
|
9
|
+
Then I should see the test output
|
10
|
+
|
11
|
+
Scenario: A compile error happends
|
12
|
+
Given I have an invalid SML file
|
13
|
+
When I run smlspec on the file
|
14
|
+
Then I should see a compile error message
|
15
|
+
|
16
|
+
Scenario: Running it without Moscow ML installed
|
17
|
+
Given I have written an SML file with tests
|
18
|
+
And I don't have Moscow ML installed
|
19
|
+
When I run smlspec on the file
|
20
|
+
Then I should see message saying that I don't have Moscow ML installed
|
@@ -0,0 +1,54 @@
|
|
1
|
+
Given(/^I have written an SML file with tests$/) do
|
2
|
+
File.open("tmp/integration_file.sml", "w") do |f|
|
3
|
+
f.puts "fun f _ = 3"
|
4
|
+
f.puts "val f_test1 = f 3 = 3"
|
5
|
+
f.puts "val f_test2 = f 5 = 3"
|
6
|
+
f.puts "val f_test3 = f 3 = 5"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
Given(/^I have an invalid SML file$/) do
|
11
|
+
File.open("tmp/integration_file.sml", "w") do |f|
|
12
|
+
f.puts "val foo = foo"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
When(/^I run smlspec on the file$/) do
|
17
|
+
@output = `./bin/smlspec tmp/integration_file.sml`
|
18
|
+
end
|
19
|
+
|
20
|
+
Then(/^I should see the test output$/) do
|
21
|
+
lines = [
|
22
|
+
".".green + ".".green + "F".red,
|
23
|
+
"",
|
24
|
+
"",
|
25
|
+
"",
|
26
|
+
"f_test3".red,
|
27
|
+
"",
|
28
|
+
"",
|
29
|
+
"3 tests ran, 1 red, 2 green",
|
30
|
+
"",
|
31
|
+
"",
|
32
|
+
].join("\n")
|
33
|
+
|
34
|
+
lines.should eq @output
|
35
|
+
|
36
|
+
clean_tmp
|
37
|
+
end
|
38
|
+
|
39
|
+
Then(/^I should see a compile error message$/) do
|
40
|
+
expected = [
|
41
|
+
"Unable to run tests, SML says:".red,
|
42
|
+
"",
|
43
|
+
"",
|
44
|
+
'File "tmp/integration_file.sml", line 2, characters 10-13:',
|
45
|
+
'! val foo = foo<EOF>',
|
46
|
+
'! ^^^^^^^^',
|
47
|
+
'! Unbound value identifier: foo',
|
48
|
+
"",
|
49
|
+
].join("\n")
|
50
|
+
|
51
|
+
@output.should eq expected
|
52
|
+
|
53
|
+
clean_tmp
|
54
|
+
end
|
data/lib/formats_tests.rb
CHANGED
@@ -6,11 +6,11 @@ class FormatsTests
|
|
6
6
|
match = line.match(/val (.*?_test\d) = (.*?)$/)
|
7
7
|
|
8
8
|
if match
|
9
|
-
lines[i] = "val #{match[1]} =
|
9
|
+
lines[i] = "val #{match[1]} = assert \"#{match[1]}\" (#{match[2]})"
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
13
|
# TODO: make this a little nicer
|
14
|
-
'fun
|
14
|
+
'fun assert desc condition = print(desc^" "^Bool.toString(condition)^"\n")' + "\n" + lines.join("\n")
|
15
15
|
end
|
16
16
|
end
|
data/lib/test.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
class Test
|
2
|
+
attr_reader :status, :name
|
3
|
+
|
4
|
+
def initialize(status, name)
|
5
|
+
@status = status
|
6
|
+
@name = name
|
7
|
+
end
|
8
|
+
|
9
|
+
def passed?
|
10
|
+
@status
|
11
|
+
end
|
12
|
+
|
13
|
+
def ==(another_test)
|
14
|
+
fields_used_for_comparison.inject(true) do |acc, m|
|
15
|
+
acc && instance_variable_get("@#{m}") == another_test.send(m)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def fields_used_for_comparison
|
22
|
+
[:status, :name]
|
23
|
+
end
|
24
|
+
end
|
data/lib/test_output.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
class TestOutput
|
2
|
+
attr_reader :message
|
3
|
+
|
4
|
+
def initialize(lines)
|
5
|
+
@lines = lines
|
6
|
+
|
7
|
+
if compile_error?
|
8
|
+
@message = lines.join("\n")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def compile_error?
|
13
|
+
@lines.any? { |line| /^!/ =~ line }
|
14
|
+
end
|
15
|
+
|
16
|
+
def tests
|
17
|
+
@lines.inject([]) do |acc, line|
|
18
|
+
acc << if /true/ =~ line
|
19
|
+
Test.new(true, line.match(/(.+) true/)[1])
|
20
|
+
else
|
21
|
+
Test.new(false, line.match(/(.+) false/)[1])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class TestOutputPresenter
|
2
|
+
def self.parse(test_results)
|
3
|
+
parser = self.new(test_results)
|
4
|
+
|
5
|
+
if test_results.compile_error?
|
6
|
+
parser.parse_error
|
7
|
+
else
|
8
|
+
parser.parse
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(test_results)
|
13
|
+
@test_results = test_results
|
14
|
+
@tests = test_results.tests unless @test_results.compile_error?
|
15
|
+
end
|
16
|
+
|
17
|
+
def parse
|
18
|
+
output = ""
|
19
|
+
|
20
|
+
output += dots_or_fs + "\n"
|
21
|
+
if failures.count > 0
|
22
|
+
output += blank_lines(3) + "\n"
|
23
|
+
output += failed_tests + "\n"
|
24
|
+
end
|
25
|
+
output += blank_lines(2) + "\n"
|
26
|
+
output += "#{@tests.count} tests ran, #{failures.count} red, #{passed.count} green"
|
27
|
+
output += blank_lines(3)
|
28
|
+
|
29
|
+
output
|
30
|
+
end
|
31
|
+
|
32
|
+
def parse_error
|
33
|
+
[
|
34
|
+
"Unable to run tests, SML says:".red,
|
35
|
+
"",
|
36
|
+
"",
|
37
|
+
@test_results.message,
|
38
|
+
].join("\n")
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def blank_lines(n)
|
44
|
+
Array.new(n, "").join("\n")
|
45
|
+
end
|
46
|
+
|
47
|
+
def dots_or_fs
|
48
|
+
@tests.inject("") do |acc, test|
|
49
|
+
if test.passed?
|
50
|
+
acc += ".".green
|
51
|
+
else
|
52
|
+
acc += "F".red
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def failed_tests
|
58
|
+
failures.map { |t| t.name.red }.join("\n")
|
59
|
+
end
|
60
|
+
|
61
|
+
def failures
|
62
|
+
@tests.reject(&:passed?)
|
63
|
+
end
|
64
|
+
|
65
|
+
def passed
|
66
|
+
@tests.select(&:passed?)
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# Create the directory structure
|
4
|
+
mkdir -p features/step_definitions
|
5
|
+
mkdir -p features/support
|
6
|
+
|
7
|
+
# Create a placeholder for the step_definitions folder
|
8
|
+
touch features/step_definitions/"$(basename `pwd`)_steps.rb"
|
9
|
+
|
10
|
+
# Create the environment file
|
11
|
+
echo '$: << File.expand_path("../../lib", File.dirname(__FILE__))' > features/support/env.rb
|
12
|
+
echo "require '$(basename `pwd`)'" >> features/support/env.rb
|
13
|
+
|
14
|
+
# Uncomment to Generate sample feature
|
15
|
+
#echo "Feature: Sample Feature
|
16
|
+
#
|
17
|
+
# Scenario: Sample Scenario
|
18
|
+
# Given the world
|
19
|
+
# When your whishes come truth
|
20
|
+
# Then you are happy
|
21
|
+
#" > features/sample.feature
|
22
|
+
|
23
|
+
# Give user some output
|
24
|
+
echo "Cucumber file structure created successfully."
|
data/smlspec.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'smlspec'
|
3
|
-
s.version = '0.0.
|
3
|
+
s.version = '0.0.5'
|
4
4
|
s.date = '2012-12-16'
|
5
5
|
s.summary = "Runner for SML tests"
|
6
6
|
s.description = "Gem for running tests in SML files"
|
@@ -11,7 +11,10 @@ Gem::Specification.new do |s|
|
|
11
11
|
|
12
12
|
s.add_development_dependency 'rake'
|
13
13
|
s.add_development_dependency 'rspec'
|
14
|
+
s.add_development_dependency 'cucumber'
|
15
|
+
|
14
16
|
s.add_runtime_dependency 'colorize'
|
17
|
+
s.add_runtime_dependency 'thor'
|
15
18
|
|
16
19
|
s.files = `git ls-files`.split("\n")
|
17
20
|
s.test_files = `git ls-files -- {spec}/*_spec.rb`.split("\n")
|
@@ -1,14 +1,14 @@
|
|
1
|
-
fun
|
1
|
+
fun assert desc condition = print(desc^" "^Bool.toString(condition)^"\n")
|
2
2
|
fun headString "" = "" | headString s = String.extract (s, 0, SOME 1)
|
3
3
|
fun tailString "" = "" | tailString s = String.extract (s, 1, NONE)
|
4
|
-
val allDefined_test1 =
|
5
|
-
val allDefined_test2 =
|
4
|
+
val allDefined_test1 = assert "allDefined_test1" (allDefined [NONE,SOME 7,SOME 3,NONE, SOME 7] = [7,3,7])
|
5
|
+
val allDefined_test2 = assert "allDefined_test2" (allDefined [NONE,NONE,NONE] = [])
|
6
6
|
local
|
7
7
|
fun f x = x+2
|
8
8
|
fun h x = x*2
|
9
9
|
fun g x = x div 2
|
10
10
|
in
|
11
|
-
val dollar_test1 =
|
11
|
+
val dollar_test1 = assert "dollar_test1" (g (h (f (g (h 2)))) = g $ h $ f $ g $ h 2)
|
12
12
|
end
|
13
|
-
val countdown_test2 =
|
14
|
-
val svgLine_test1 =
|
13
|
+
val countdown_test2 = assert "countdown_test2" ((countdown ~1; false) handle Domain => true | _ => false)
|
14
|
+
val svgLine_test1 = assert "svgLine_test1" (svgLine [(0,0), (100,100), (200,0)] = "<svg xmlns=\"http://www.w3.org/2000/svg\""^ "style=\"stroke: black; stroke-width: 2px;\">"^ "<line x1=\"0\" y1=\"0\" x2=\"100\" y2=\"100\" />"^ "<line x1=\"100\" y1=\"100\" x2=\"200\" y2=\"0\" />"^ "</svg>")
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'looks_for_mosml'
|
3
|
+
|
4
|
+
describe LooksForMosml do
|
5
|
+
it "knows when mosml is not installed" do
|
6
|
+
CommandLine.should_receive(:run_command).with("which mosml > /dev/null").
|
7
|
+
and_return(true)
|
8
|
+
|
9
|
+
LooksForMosml.installed?.should be_true
|
10
|
+
end
|
11
|
+
|
12
|
+
it "knows when mosml is not installed" do
|
13
|
+
CommandLine.should_receive(:run_command).with("which mosml > /dev/null").
|
14
|
+
and_return(false)
|
15
|
+
|
16
|
+
LooksForMosml.installed?.should be_false
|
17
|
+
end
|
18
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,20 +1,11 @@
|
|
1
1
|
require 'pp'
|
2
|
+
require_relative 'support/helper_methods'
|
2
3
|
|
3
|
-
# This file was generated by the `rspec --init` command. Conventionally, all
|
4
|
-
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
5
|
-
# Require this file using `require "spec_helper"` to ensure that it is only
|
6
|
-
# loaded once.
|
7
|
-
#
|
8
|
-
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
9
4
|
RSpec.configure do |config|
|
10
5
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
11
6
|
config.run_all_when_everything_filtered = true
|
12
7
|
config.filter_run :focus
|
13
8
|
|
14
|
-
# Run specs in random order to surface order dependencies. If you find an
|
15
|
-
# order dependency and want to debug it, you can fix the order by providing
|
16
|
-
# the seed, which is printed after each run.
|
17
|
-
# --seed 1234
|
18
9
|
config.order = 'random'
|
19
10
|
end
|
20
11
|
|
@@ -22,7 +13,3 @@ def fixture(fixture_name)
|
|
22
13
|
File.read("spec/fixtures/#{fixture_name}").chomp
|
23
14
|
end
|
24
15
|
|
25
|
-
def clean_tmp
|
26
|
-
Dir.glob("tmp/*").each {|f| FileUtils.rm_f(f) }
|
27
|
-
end
|
28
|
-
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require '
|
2
|
+
require 'test_output_presenter'
|
3
3
|
require 'colorize'
|
4
4
|
|
5
|
-
describe
|
5
|
+
describe TestOutputPresenter do
|
6
6
|
it "parses output for passed tests" do
|
7
|
-
output = [
|
8
|
-
|
9
|
-
|
10
|
-
]
|
7
|
+
output = double(:test_output, compile_error?: false, tests: [
|
8
|
+
double(:test, passed?: true, name: "foo_test1"),
|
9
|
+
double(:test, passed?: false, name: "foo_test2"),
|
10
|
+
])
|
11
11
|
|
12
12
|
parsed_output = [
|
13
13
|
".".green + "F".red,
|
@@ -22,14 +22,14 @@ describe TestOutputParser do
|
|
22
22
|
"",
|
23
23
|
].join("\n")
|
24
24
|
|
25
|
-
|
25
|
+
TestOutputPresenter.parse(output).should eq parsed_output
|
26
26
|
end
|
27
27
|
|
28
28
|
it "parses output with only passes" do
|
29
|
-
output = [
|
30
|
-
|
31
|
-
|
32
|
-
]
|
29
|
+
output = double(:test_output, compile_error?: false, tests: [
|
30
|
+
double(:test, passed?: true, name: "foo_test1"),
|
31
|
+
double(:test, passed?: true, name: "foo_test2"),
|
32
|
+
])
|
33
33
|
|
34
34
|
parsed_output = [
|
35
35
|
".".green+".".green,
|
@@ -40,17 +40,19 @@ describe TestOutputParser do
|
|
40
40
|
"",
|
41
41
|
].join("\n")
|
42
42
|
|
43
|
-
|
43
|
+
TestOutputPresenter.parse(output).should eq parsed_output
|
44
44
|
end
|
45
45
|
|
46
46
|
it "parses output from a failure" do
|
47
|
-
|
47
|
+
failure_message = [
|
48
48
|
'File "foo.sml", line 1, characters 0-3:',
|
49
49
|
'! foo',
|
50
50
|
'! ^^^',
|
51
51
|
'! Syntax error.',
|
52
52
|
].join("\n")
|
53
53
|
|
54
|
+
output = double(:test_output, compile_error?: true, message: failure_message)
|
55
|
+
|
54
56
|
parsed_output = [
|
55
57
|
"Unable to run tests, SML says:".red,
|
56
58
|
"",
|
@@ -61,6 +63,6 @@ describe TestOutputParser do
|
|
61
63
|
'! Syntax error.',
|
62
64
|
].join("\n")
|
63
65
|
|
64
|
-
|
66
|
+
TestOutputPresenter.parse(output).should eq parsed_output
|
65
67
|
end
|
66
68
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'test_output'
|
3
|
+
|
4
|
+
class Test; end
|
5
|
+
|
6
|
+
describe TestOutput do
|
7
|
+
before do
|
8
|
+
Test.stub(:new) { double(:test) }
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:lines) do
|
12
|
+
["foo_test1 true",
|
13
|
+
"foo_test2 false"]
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:failure_message) do
|
17
|
+
['File "foo.sml", line 1, characters 0-3:',
|
18
|
+
'! foo',
|
19
|
+
'! ^^^',
|
20
|
+
'! Syntax error.']
|
21
|
+
end
|
22
|
+
|
23
|
+
it "parses output from tests" do
|
24
|
+
Test.should_receive(:new).with(true, "foo_test1")
|
25
|
+
Test.should_receive(:new).with(false, "foo_test2")
|
26
|
+
|
27
|
+
output = TestOutput.new(lines)
|
28
|
+
|
29
|
+
output.compile_error?.should be_false
|
30
|
+
output.should have(2).tests
|
31
|
+
end
|
32
|
+
|
33
|
+
it "parses output from a compile error" do
|
34
|
+
output = TestOutput.new(failure_message)
|
35
|
+
|
36
|
+
output.compile_error?.should be_true
|
37
|
+
output.message.should eq failure_message.join("\n")
|
38
|
+
end
|
39
|
+
end
|
data/spec/test_spec.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'test'
|
3
|
+
|
4
|
+
describe Test do
|
5
|
+
it "can be passed" do
|
6
|
+
Test.new(true, "").should be_passed
|
7
|
+
end
|
8
|
+
|
9
|
+
it "can be failed" do
|
10
|
+
Test.new(false, "").should_not be_passed
|
11
|
+
end
|
12
|
+
|
13
|
+
it "has a name" do
|
14
|
+
Test.new(false, "foo_test1").name.should eq "foo_test1"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "has a status" do
|
18
|
+
Test.new(false, "foo_test1").status.should eq false
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smlspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Pedersen
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: cucumber
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: colorize
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - '>='
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: thor
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
description: Gem for running tests in SML files
|
56
84
|
email: david.pdrsn@gmail.com
|
57
85
|
executables:
|
@@ -61,6 +89,7 @@ extra_rdoc_files: []
|
|
61
89
|
files:
|
62
90
|
- .gitignore
|
63
91
|
- .rspec
|
92
|
+
- CHANGELOG.md
|
64
93
|
- Gemfile
|
65
94
|
- Gemfile.lock
|
66
95
|
- LICENSE
|
@@ -70,10 +99,18 @@ files:
|
|
70
99
|
- bin/smlspec
|
71
100
|
- build/smlspec-0.0.2.gem
|
72
101
|
- build/smlspec-0.0.3.gem
|
102
|
+
- build/smlspec-0.0.4.gem
|
103
|
+
- features/running_tests.feature
|
104
|
+
- features/step_definitions/smlspec_steps.rb
|
105
|
+
- features/support/env.rb
|
73
106
|
- lib/formats_lines.rb
|
74
107
|
- lib/formats_tests.rb
|
108
|
+
- lib/looks_for_mosml.rb
|
75
109
|
- lib/sml_file.rb
|
76
|
-
- lib/
|
110
|
+
- lib/test.rb
|
111
|
+
- lib/test_output.rb
|
112
|
+
- lib/test_output_presenter.rb
|
113
|
+
- scripts/cucumber_init.sh
|
77
114
|
- smlspec.gemspec
|
78
115
|
- spec/fixtures/broken_lines.sml
|
79
116
|
- spec/fixtures/formatted.sml
|
@@ -92,9 +129,13 @@ files:
|
|
92
129
|
- spec/fixtures/without_whitespace.sml
|
93
130
|
- spec/formats_lines_spec.rb
|
94
131
|
- spec/formats_tests_spec.rb
|
132
|
+
- spec/looks_for_mosml_spec.rb
|
95
133
|
- spec/sml_file_spec.rb
|
96
134
|
- spec/spec_helper.rb
|
97
|
-
- spec/
|
135
|
+
- spec/support/helper_methods.rb
|
136
|
+
- spec/test_output_presenter_spec.rb
|
137
|
+
- spec/test_output_spec.rb
|
138
|
+
- spec/test_spec.rb
|
98
139
|
homepage: http://github.com/davidpdrsn/smlspec
|
99
140
|
licenses:
|
100
141
|
- MIT
|
data/lib/test_output_parser.rb
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
class TestOutputParser
|
2
|
-
def self.parse(input)
|
3
|
-
parser = self.new(input)
|
4
|
-
|
5
|
-
if input.match(/!/)
|
6
|
-
parser.parse_error
|
7
|
-
else
|
8
|
-
parser.parse
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def initialize(input)
|
13
|
-
@input = input
|
14
|
-
end
|
15
|
-
|
16
|
-
def parse
|
17
|
-
output = ""
|
18
|
-
|
19
|
-
output += dots_or_fs + "\n"
|
20
|
-
if failures > 0
|
21
|
-
output += blank_lines(3) + "\n"
|
22
|
-
output += failed_tests + "\n"
|
23
|
-
end
|
24
|
-
output += blank_lines(2) + "\n"
|
25
|
-
output += "#{total} tests ran, #{failures} red, #{passed} green" + "\n"
|
26
|
-
output += blank_lines(2)
|
27
|
-
|
28
|
-
output
|
29
|
-
end
|
30
|
-
|
31
|
-
def parse_error
|
32
|
-
[
|
33
|
-
"Unable to run tests, SML says:".red,
|
34
|
-
"",
|
35
|
-
"",
|
36
|
-
@input,
|
37
|
-
].join("\n")
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def blank_lines(n)
|
43
|
-
Array.new(n, "").join("\n")
|
44
|
-
end
|
45
|
-
|
46
|
-
def dots_or_fs
|
47
|
-
@input.split("\n").inject("") do |acc, s|
|
48
|
-
if s.include?("true")
|
49
|
-
acc += ".".green
|
50
|
-
else
|
51
|
-
acc += "F".red
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def failed_tests
|
57
|
-
@input.split("\n").select do |s|
|
58
|
-
s.include?("false")
|
59
|
-
end.inject("") do |acc, s|
|
60
|
-
s.gsub(" false", "").red
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def total
|
65
|
-
@input.split("\n").count
|
66
|
-
end
|
67
|
-
|
68
|
-
def failures
|
69
|
-
@input.split("\n").select do |s|
|
70
|
-
s.include?("false")
|
71
|
-
end.count
|
72
|
-
end
|
73
|
-
|
74
|
-
def passed
|
75
|
-
@input.split("\n").select do |s|
|
76
|
-
s.include?("true")
|
77
|
-
end.count
|
78
|
-
end
|
79
|
-
end
|