mrubyc-test 0.1.0 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 160ab8e14780603229e59811a6dc2c387cacf4a9e9037d271d41b2e9746fea37
4
- data.tar.gz: 598655a35c67729fe21fb90f4b9920428148eb59ed385ccfe32178b82cf38e65
3
+ metadata.gz: cc5bc4e134fa8b9f118adf8aaa0048fa728524e2add9d4b1563115a0829f1c23
4
+ data.tar.gz: 1cf62ac75d14e2c2dfaf43f4081152665310b319348a95fc40fede060e831aca
5
5
  SHA512:
6
- metadata.gz: 7a846f95b6cd76f38febef344e34ed912d396376e233c704f2a2bb4c436d30433524b01bcb860ec218cab9306f6afa1395d0e09c741bc72686ab27889d0751f2
7
- data.tar.gz: 1ee0ffe96570e29fa18a6f668adbc7dc604d4087b2312c01852b8db0c9876f6548e4b4baa0cc08bccba16971964cd6a515a98d0ae2838e455f7553ab9baefdd6
6
+ metadata.gz: 767dceb63110ea84b2a817c8762f6939ebf65adcf066f73ee31a53322ad30898467ad2ec5a64c586288ac7e94973c8b96c2d34864ddbd6142740cdee9b7f3a8b
7
+ data.tar.gz: 96e922f553d5e8eeda9fb1e96c1909375b778c87264ec3e98376ddf55631366441c0e55c770e57154d7ef57c41750d17755c9fdec5f711d1b0bcd484767ce4af
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mrubyc-test (0.1.0)
4
+ mrubyc-test (0.2.0)
5
5
  activesupport (~> 5.2)
6
6
  rufo (~> 0.4)
7
7
  thor (~> 0.20)
data/README.md CHANGED
@@ -8,11 +8,12 @@ The API design and implementation of this gem is greatly inspired by [test-unit]
8
8
 
9
9
  ## Features
10
10
 
11
- - Tests are applicable to mruby code. C code will not be covered
11
+ - Tests are applicable to class and its instance methods written with mruby
12
+ - C code will not be covered directly though, you can test your C implementation if you write mruby wrapper class. In this case, your test class (it also written with mruby) will test an integrated circumstance of C and mruby
12
13
  - Tests will run on your PC (POSIX) hereby you can write *business logic* with mruby/c apart from C API matters like microcontroler peripherals
13
14
  - Simple assertions ... enough for almost firmware development though, I will increase the number of assertion
14
15
  - Stub ... You can write your mruby code without peripheral implementation by C
15
- - Mock ... You can call any method sill doesn't exist
16
+ - Mock ... You can call any method still doesn't exist
16
17
  - The implementation of your application and test code will be analyzed by CRuby program, then comlpiled into mruby byte code and executed on mruby/c VM
17
18
 
18
19
  ## Installation
@@ -31,19 +32,23 @@ Or install it yourself as:
31
32
 
32
33
  $ gem install mrubyc-test
33
34
 
35
+
34
36
  ## Usage
35
37
 
36
38
  Assuming you are using [mrubyc-utils](https://github.com/hasumikin/mrubyc-utils) to manage your project and [rbenv](https://github.com/rbenv/rbenv) to manage Ruby versions.
37
- It means you have `.mrubycconfig` file in the top directory of your project.
39
+ It means you have `.mrubycconfig` and `.ruby-version` in the top directory of your project.
38
40
 
39
41
  Besides, you have to locate mruby model files that are the target of testing like `mrblib/models/class_name.rb`
40
42
 
43
+ And read [here](https://github.com/hasumikin/mrubyc-utils#wrapper-of-gem-mrubyc-test-and-mrubyc-debugger) about why you should use mrubyc-utils.
44
+
41
45
  This is an example of ESP32 project:
42
46
 
43
47
  ```
44
48
  ~/your_project $ tree
45
49
  .
46
- ├── .mrubycconfig # Created by mrubyc-utils
50
+ ├── .mrubycconfig # Created by mrubyc-utils
51
+ ├── .ruby-version # It should be mruby's version something like 'mruby-1.4.1'
47
52
  ├── Makefile
48
53
  ├── build
49
54
  ├── components
@@ -52,7 +57,7 @@ This is an example of ESP32 project:
52
57
  │      └── models # Place your model class files here
53
58
  │            ├── class_name.rb # The testing target `ClassName`
54
59
  │            └── my_class.rb # The testing target `MyClass`
55
- │      └── tasks
60
+ │      └── loops
56
61
  │            ├── main.rb # Loop script isn't covered by mrubyc-test. use mrubyc-debugger
57
62
  │            └── sub.rb # Loop script isn't covered by mrubyc-test. use mrubyc-debugger
58
63
  └── sdkconfig
@@ -60,15 +65,15 @@ This is an example of ESP32 project:
60
65
 
61
66
  In the same directory:
62
67
 
63
- $ mrubyc-test init
68
+ $ mrubyc-utils test init
64
69
 
65
70
  Then, some directories and files will be created in your project.
66
71
  Now you can run test because a sample test code was also created.
67
72
 
68
- $ mrubyc-test test
73
+ $ mrubyc-utils test
69
74
 
70
- You should get some assertion faulures.
71
- Take a look at `test/sample_test.rb` to handle the failures and know how to write your own test.
75
+ You should get some assertion failures.
76
+ Take a look at `test/sample_test.rb` to handle the failures and find how to write your own test.
72
77
 
73
78
  ### Asserions
74
79
 
@@ -131,12 +136,10 @@ end
131
136
 
132
137
  ## Known problems
133
138
 
134
- - `.ruby-version` should be set to a veriosn of CRuby to use mrubyc-test command although mruby/c developers want to set it like mruby-1.4.1
135
139
  - You have to write stub or mock test fot all the methods still do not exist otherwise your test won't turn green
136
140
 
137
141
  ## TODO (possibly)
138
142
 
139
- - Better solution of coexistence of CRuby and mruby. May be a kind of wrapper tool or rbenv plugin?
140
143
  - Assertion against arguments of mock
141
144
  - Other assertions like LT(<), GTE(>=), include?, ...etc.
142
145
  - bla bla bla
@@ -1,51 +1,91 @@
1
1
  class MrubycTestCase
2
- def initialize(information)
2
+ def initialize(information, verbose = true)
3
3
  @information = information
4
4
  $mock ||= Mock.new
5
- @puts_success_message = true
6
- @puts_failure_message = true
7
- end
8
- def puts_information
9
- puts
10
- puts @information[:test_class_name] + '#' + @information[:method_name]
5
+ @puts_success_message = verbose
6
+ @puts_failure_message = verbose
11
7
  end
8
+
12
9
  def success(assertion, expected, actual)
13
- puts_information
14
10
  $success_count += 1
15
11
  if @puts_success_message
16
- puts $colors[:success] + ' assertion : ' + assertion.to_s + $colors[:normal]
17
- puts $colors[:success] + ' result : ' + actual.to_ss + $colors[:normal]
12
+ puts $colors[:success] + ' ' + actual.to_ss + " (:" + assertion.to_s + ")" + $colors[:reset]
18
13
  else
19
- print $colors[:success] + '.' + $colors[:normal]
14
+ print $colors[:success] + '.' + $colors[:reset]
20
15
  end
21
16
  end
22
17
  def failure(assertion, expected, actual, message)
23
- puts_information
24
- $failure_count += 1
18
+ $failures << {
19
+ class_and_method: $current_class_and_method,
20
+ path: @information[:path].to_s,
21
+ line: @information[:line].to_s,
22
+ description: @information[:description].to_s,
23
+ message: message,
24
+ assertion: assertion.to_s,
25
+ expected: expected.to_s,
26
+ actual: actual.to_ss
27
+ }
25
28
  if @puts_failure_message
26
- puts $colors[:failure] + ' path : ' + @information[:path].to_s
27
- puts $colors[:failure] + ' line : ' + @information[:line].to_s
28
- puts $colors[:failure] + ' description: ' + @information[:description].to_s
29
- puts $colors[:failure] + ' ' + message if message
30
- puts $colors[:failure] + ' assertion : ' + assertion.to_s + $colors[:normal]
31
- puts $colors[:failure] + ' expected : ' + expected.to_ss + $colors[:normal]
32
- puts $colors[:failure] + ' actual : ' + actual.to_ss + $colors[:normal]
29
+ puts $colors[:failure] + ' ' + actual.to_ss + " (:" + assertion.to_s + ")" + $colors[:reset]
33
30
  else
34
- print $colors[:failure] + '.' + $colors[:normal]
31
+ print $colors[:failure] + '.' + $colors[:reset]
35
32
  end
36
33
  end
34
+
35
+ def pend
36
+ $pendings << {
37
+ class_and_method: $current_class_and_method,
38
+ path: @information[:path].to_s,
39
+ line: @information[:line].to_s,
40
+ }
41
+ print $colors[:pending] + '.' + $colors[:reset]
42
+ end
43
+
37
44
  def assert_equal(expected, actual, message = nil)
38
45
  assertion = :assert_equal
39
46
  actual == expected ? success(assertion, expected, actual) : failure(assertion, expected, actual, message)
40
47
  end
48
+
41
49
  def assert_not_equal(expected, actual, message = nil)
42
50
  assertion = :assert_not_equal
43
51
  actual != expected ? success(assertion, expected, actual) : failure(assertion, expected, actual, message)
44
52
  end
53
+
54
+ def assert_nil(expression, message = nil)
55
+ assertion = :assert_not_nil
56
+ expression == nil ? success(assertion, nil, expression) : failure(assertion, "nil", expression, message)
57
+ end
58
+
45
59
  def assert_not_nil(expression, message = nil)
46
60
  assertion = :assert_not_nil
47
- expression != nil ? success(assertion, nil, expression) : failure(assertion, nil, expression, message)
61
+ expression != nil ? success(assertion, nil, expression) : failure(assertion, "!nil", expression, message)
62
+ end
63
+
64
+ def assert(expression, message = nil)
65
+ assertion = :assert
66
+ expression ? success(assertion, nil, expression) : failure(assertion, "!nil && !false", expression, message)
48
67
  end
68
+
69
+ def assert_true(expression, message = nil)
70
+ assertion = :assert_true
71
+ expression == true ? success(assertion, nil, expression) : failure(assertion, "true", expression, message)
72
+ end
73
+
74
+ def assert_false(expression, message = nil)
75
+ assertion = :assert_false
76
+ expression == false ? success(assertion, nil, expression) : failure(assertion, "false", expression, message)
77
+ end
78
+
79
+ def assert_in_delta(expected, actual, message = nil, delta = 0.001)
80
+ assertion = :assert_in_delta
81
+ dt = actual - expected
82
+ if -delta <= dt && dt <= delta
83
+ success(assertion, expected, actual)
84
+ else
85
+ failure(assertion, expected, actual, message)
86
+ end
87
+ end
88
+
49
89
  def self.description(text)
50
90
  end
51
91
  def self.desc(text)
@@ -68,5 +108,3 @@ class MrubycTestCase
68
108
  end
69
109
  end
70
110
  end
71
-
72
-
data/lib/mrubyc-test.rb CHANGED
@@ -14,68 +14,107 @@ module Mrubyc::Test
14
14
  class Error < StandardError; end
15
15
 
16
16
  class Tool < Thor
17
+ default_command :test
18
+
17
19
  desc 'init', 'Initialize requirements for unit test of mruby/c. Some directories and files will be created. Note that existing objects may be overridden'
18
20
  def init
19
21
  Mrubyc::Test::Init.run
20
22
  end
21
23
 
22
- desc 'prepare', 'Create a ruby script that has all the requirements of your test'
23
- def prepare
24
- config = Mrubyc::Test::Config.read
25
- model_files = Dir.glob(File.join(Dir.pwd, config['mruby_lib_dir'], 'models', '*.rb'))
26
- test_path = File.join(Dir.pwd, config['test_dir'], '*.rb')
27
- test_files = Dir.glob(test_path)
28
- if test_files.size == 0
29
- puts 'Test not found'
30
- puts 'search path: ' + test_path
31
- exit(1)
24
+ no_commands do
25
+ def prepare(test_files, verbose, method_name_pattern)
26
+ config = Mrubyc::Test::Config.read
27
+ model_files = Dir.glob(File.join(Dir.pwd, config['mruby_lib_dir'], 'models', '*.rb'))
28
+
29
+ # gather attributes from your implementations and tests
30
+ attributes = Mrubyc::Test::Generator::Attribute.run(model_files: model_files, test_files: test_files)
31
+
32
+ # convert attributes into tast_cases
33
+ test_cases = Mrubyc::Test::Generator::TestCase.run(attributes)
34
+
35
+ # generate a ruby script that will be compiled by mrbc and executed in mruby/c VM
36
+ Mrubyc::Test::Generator::Script.run(model_files: model_files, test_files: test_files, test_cases: test_cases, verbose: verbose, method_name_pattern: method_name_pattern)
32
37
  end
33
38
 
34
- # gather attributes from your implementations and tests
35
- attributes = Mrubyc::Test::Generator::Attribute.run(model_files: model_files, test_files: test_files)
39
+ def make
40
+ config = Mrubyc::Test::Config.read
41
+ tmp_dir = File.join(Dir.pwd, config['test_tmp_dir'])
42
+ puts "cd #{tmp_dir}"
43
+ puts
44
+ exit_code = 0
45
+ pwd = Dir.pwd
46
+ mruby_version = File.read('.ruby-version').gsub("\n", '').chomp
47
+ unless mruby_version.index('mruby')
48
+ puts '.ruby-version doesn\'t set `mruby-x.x.x It is recommended to use the latest version of https://github.com/hasumikin/mrubyc-utils`'
49
+ print 'You can specify the version name of mruby [mruby-x.x.x]: '
50
+ mruby_version = STDIN.gets.chomp
51
+ end
52
+ FileUtils.mv "#{pwd}/#{config['mrubyc_src_dir']}/hal", "#{pwd}/#{config['mrubyc_src_dir']}/~hal"
53
+ begin
54
+ FileUtils.ln_s "#{pwd}/#{config['test_tmp_dir']}/hal", "#{pwd}/#{config['mrubyc_src_dir']}/hal"
55
+ Dir.chdir(tmp_dir) do
56
+ [
57
+ "RBENV_VERSION=#{mruby_version} mrbc -E -B test test.rb",
58
+ "cc #{ENV["CFLAGS"]} #{ENV["LDFLAGS"]} -I #{pwd}/#{config['mrubyc_src_dir']} -o test main.c #{pwd}/#{config['mrubyc_src_dir']}/*.c #{pwd}/#{config['mrubyc_src_dir']}/hal/*.c",
59
+ "./test"].each do |cmd|
60
+ puts cmd
61
+ puts
62
+ exit_code = system(cmd) ? 0 : 1
63
+ exit(exit_code) if exit_code > 0
64
+ end
65
+ end
66
+ ensure
67
+ FileUtils.rm "#{pwd}/#{config['mrubyc_src_dir']}/hal"
68
+ FileUtils.mv "#{pwd}/#{config['mrubyc_src_dir']}/~hal", "#{pwd}/#{config['mrubyc_src_dir']}/hal"
69
+ end
70
+ end
36
71
 
37
- # convert attributes into tast_cases
38
- test_cases = Mrubyc::Test::Generator::TestCase.run(attributes)
72
+ def init_env
73
+ ENV["CFLAGS"] ||= "-std=gnu99 -DMRBC_DEBUG -DMRBC_USE_MATH=1 -Wall"
74
+ ENV["LDFLAGS"] ||= "-Wl,--no-as-needed -lm"
75
+ end
39
76
 
40
- # generate a ruby script that will be compiled by mrbc and executed in mruby/c VM
41
- Mrubyc::Test::Generator::Script.run(model_files: model_files, test_files: test_files, test_cases: test_cases)
42
77
  end
43
78
 
44
- desc 'make', 'compile test script into executable && run it'
45
- def make
46
- config = Mrubyc::Test::Config.read
47
- tmp_dir = File.join(Dir.pwd, config['test_tmp_dir'])
48
- puts "cd #{tmp_dir}"
49
- puts
50
- exit_code = 0
51
- pwd = Dir.pwd
52
- FileUtils.mv "#{pwd}/#{config['mrubyc_src_dir']}/hal", "#{pwd}/#{config['mrubyc_src_dir']}/~hal"
53
- begin
54
- FileUtils.ln_s "#{pwd}/#{config['test_tmp_dir']}/hal", "#{pwd}/#{config['mrubyc_src_dir']}/hal"
55
- Dir.chdir(tmp_dir) do
56
- ['~/.rbenv/versions/mruby-1.4.1/bin/mrbc -E -B test test.rb',
57
- "cc -I #{pwd}/#{config['mrubyc_src_dir']} -DMRBC_DEBUG -o test main.c #{pwd}/#{config['mrubyc_src_dir']}/*.c #{pwd}/#{config['mrubyc_src_dir']}/hal/*.c",
58
- './test'].each do |cmd|
59
- puts cmd
60
- puts
61
- exit_code = system(cmd) ? 0 : 1
62
- end
63
- puts
64
- puts "cd -"
65
- puts
66
- end
67
- ensure
68
- FileUtils.rm "#{pwd}/#{config['mrubyc_src_dir']}/hal"
69
- FileUtils.mv "#{pwd}/#{config['mrubyc_src_dir']}/~hal", "#{pwd}/#{config['mrubyc_src_dir']}/hal"
79
+ desc 'test', '[Default command] Execute test. You can specify a test file like `mrubyc-test test test/array_test.rb`'
80
+ option :every, type: :numeric, default: 10, aliases: "-e", banner: "NUMBER - To avoid Out of Memory, test will be devided up to every specified NUMBER of xxx_test.rb files"
81
+ option :verbose, type: :boolean, default: false, aliases: "-v", banner: "[true/false] - Show test result verbosely"
82
+ option :name, type: :string, aliases: "-n", banner: "NAME - Specify the NAME of tests you want to run. If you write --name='/PATTERN/', it will be processed as a regular expression. It must be single-quoted and doubled-backslash. eg) --name='/a\\\\db/' will create Regexp object `/a\\db/` and match strings like `a1b`"
83
+ def test(testfilepath = "test/*.rb")
84
+ init_env
85
+ method_name_pattern = (%r{\A/(.*)/\Z} =~ options[:name] ? Regexp.new($1) : options[:name])
86
+ test_path = if testfilepath == ""
87
+ File.join(Dir.pwd, config['test_dir'], "*.rb")
88
+ else
89
+ File.join(Dir.pwd, testfilepath)
90
+ end
91
+ Dir.glob(test_path).each_slice(options[:every]) do |test_files|
92
+ prepare(test_files, options[:verbose], method_name_pattern)
93
+ make
70
94
  end
71
- exit(exit_code)
72
95
  end
73
96
 
74
- desc 'test', 'shortcut for `prepare` && `make`'
75
- def test
76
- prepare
77
- make
97
+ desc "version", "Print the version"
98
+ def version
99
+ puts "mrubyc-test v#{Mrubyc::Test::VERSION}"
78
100
  end
101
+
102
+ def help(arg = nil)
103
+ super(arg)
104
+ init_env
105
+ if arg == "test"
106
+ puts
107
+ puts "Default environment variables you can change:"
108
+ puts " CFLAGS='#{ENV['CFLAGS']}'"
109
+ puts " LDFLAGS='#{ENV['LDFLAGS']}'"
110
+ puts
111
+ end
112
+ exit if arg
113
+ puts "\e[33m Note:"
114
+ puts ' It is recommended to use mrubyc-utils as a wrapper of this gem'
115
+ puts ' see https://github.com/hasumikin/mrubyc-utils#wrapper-of-gem-mrubyc-test-and-mrubyc-debugger'
116
+ puts "\e[0m"
117
+ end
118
+
79
119
  end
80
120
  end
81
-
@@ -11,7 +11,14 @@ module Mrubyc
11
11
  # get information from model files(application code)
12
12
  model_files.each do |model_file|
13
13
  load model_file
14
- model_class = Module.const_get(File.basename(model_file, '.rb').camelize)
14
+ class_name = File.basename(model_file, '.rb').camelize
15
+ begin
16
+ model_class = Module.const_get(class_name)
17
+ rescue NameError => e
18
+ print "\e[33;1m"
19
+ puts "Could not find class named `#{class_name}`. The file #{model_file} will be ignored"
20
+ print "\e[m"
21
+ end
15
22
  model_class.class_eval do
16
23
  def method_missing(_method_name, *_args)
17
24
  # do nothing
@@ -22,6 +29,7 @@ module Mrubyc
22
29
  method_locations = {}
23
30
  description_locations = {}
24
31
  double_method_locations = {}
32
+ MrubycTestCase.init_class_variables
25
33
  test_files.each do |test_file|
26
34
  load test_file
27
35
  test_class = Module.const_get(File.basename(test_file, '.rb').camelize)
@@ -8,7 +8,7 @@ module Mrubyc
8
8
  module Generator
9
9
  class Script
10
10
  class << self
11
- def run(model_files: [], test_files:, test_cases:)
11
+ def run(model_files: [], test_files:, test_cases:, verbose:, method_name_pattern:)
12
12
  config = Mrubyc::Test::Config.read
13
13
  erb = ERB.new(File.read(File.expand_path('../../../../templates/test.rb.erb', __FILE__)), nil, '-')
14
14
  mrubyc_class_dir = File.expand_path('../../../../mrubyc-ext/', __FILE__)
@@ -23,6 +23,20 @@ module Mrubyc
23
23
  puts " mikdir -p #{hal_dir}"
24
24
  FileUtils.mkdir_p(hal_dir)
25
25
 
26
+ puts " write #{config['test_tmp_dir']}/.gitignore"
27
+ File.open("#{config['test_tmp_dir']}/.gitignore", "w") do |f|
28
+ f.puts "test"
29
+ f.puts "test.rb"
30
+ f.puts "test.c"
31
+ end
32
+
33
+ if config["cruby_version"]
34
+ puts " write #{config['test_tmp_dir']}/.ruby-version"
35
+ File.open("#{config['test_tmp_dir']}/.ruby-version", "w") do |f|
36
+ f.puts config["cruby_version"]
37
+ end
38
+ end
39
+
26
40
  Dir.chdir(hal_dir) do
27
41
  puts " download from https://raw.githubusercontent.com/mrubyc/mrubyc/master/src/hal_posix/hal.h"
28
42
  system 'wget https://raw.githubusercontent.com/mrubyc/mrubyc/master/src/hal_posix/hal.h'
@@ -43,12 +57,7 @@ module Mrubyc
43
57
  File.write(File.join(config['test_tmp_dir'], 'main.c'), erb.result(binding))
44
58
 
45
59
  puts
46
- puts "\e[32mWelcome to mrubyc-test, the world\'s first TDD tool for mruby/c microcontroller development.\e[37m"
47
- puts "\e[33m"
48
- puts 'Caution:'
49
- puts 'For the time being, mrubyc-test assumes you installed mruby-1.4.1 by rbenv. So you should have `~/.rbenv/versions/mruby-1.4.1/bin.mrbc`'
50
- puts 'Sorry for the inconvenience. It will be fixed soon!'
51
- puts "\e[37m"
60
+ puts "\e[32mWelcome to mrubyc-test, the world\'s first TDD tool for mruby/c microcontroller development.\e[0m"
52
61
  end
53
62
  end
54
63
  end
@@ -1,5 +1,5 @@
1
1
  module Mrubyc
2
2
  module Test
3
- VERSION = "0.1.0"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -41,14 +41,13 @@ class MrubycTestCase
41
41
  (@@added_method_names[self] ||= {}).keys
42
42
  end
43
43
 
44
- private
44
+ def init_class_variables
45
+ @@description_locations = {}
46
+ @@method_locations = {}
47
+ @@added_method_names = {}
48
+ end
45
49
 
46
- # for RSpec
47
- def init_class_variables
48
- @@description_locations = {}
49
- @@method_locations = {}
50
- @@added_method_names = {}
51
- end
50
+ private
52
51
 
53
52
  def method_locations
54
53
  @@method_locations[self] ||= []
@@ -3,7 +3,7 @@
3
3
  #include <stdlib.h>
4
4
  #include "test.c"
5
5
 
6
- #define MEMORY_SIZE (1024*63)
6
+ #define MEMORY_SIZE (1024*64)-1
7
7
  static uint8_t my_memory_pool[MEMORY_SIZE];
8
8
 
9
9
  int exit_code;
@@ -4,7 +4,7 @@
4
4
  # Genarated at: <%= Time.now %>
5
5
  # Your RUBY_DESCRIPTION: <%= RUBY_DESCRIPTION %>
6
6
  #
7
- # For more information, see <%= Gem.loaded_specs['mrubyc_test']&.homepage %>
7
+ # For more information, see <%= Gem.loaded_specs['mrubyc-test']&.homepage %>
8
8
  #
9
9
 
10
10
  if RUBY_VERSION == '1.9' && MRUBYC_VERSION
@@ -26,20 +26,56 @@ else
26
26
  end
27
27
  debugprint(RUBY_DESCRIPTION)
28
28
  $success_count = 0
29
- $failure_count = 0
29
+ $failures = Array.new
30
+ $pendings = Array.new
30
31
  $colors = {
31
- normal: "\e[37m",
32
+ reset: "\e[0m",
32
33
  success: "\e[32m",
33
- failure: "\e[31m"
34
+ failure: "\e[31m",
35
+ pending: "\e[33m",
36
+ info: "\e[36m"
34
37
  }
35
38
  def summerize
36
- puts 'Finished'
37
- print ($failure_count > 0) ? $colors[:failure] : $colors[:success]
38
- print ($success_count + $failure_count).to_s + ' examples, '
39
- print $failure_count.to_s + ' failures'
40
- print $colors[:normal]
39
+ failure_count = $failures.count
40
+ pending_count = $pendings.count
41
+ if pending_count > 0
42
+ puts "Pendings:\n"
43
+ $pendings.each_with_index do |pending, index|
44
+ puts $colors[:pending]
45
+ puts "#{index+1}) " + pending[:class_and_method]
46
+ print $colors[:info]
47
+ puts " # " + pending[:path] + ":" + pending[:line]
48
+ puts $colors[:reset]
49
+ end
50
+ end
51
+ color = if failure_count > 0
52
+ puts "Failures:\n"
53
+ $failures.each_with_index do |failure, index|
54
+ puts
55
+ puts "#{index+1}) " + failure[:class_and_method] + " (:" + failure[:assertion] + ")"
56
+ print $colors[:failure]
57
+ puts " description : " + failure[:description]
58
+ puts " " + failure[:message] if failure[:message]
59
+ puts " expected : " + failure[:expected]
60
+ puts " actual : " + failure[:actual]
61
+ print $colors[:info]
62
+ puts " # " + failure[:path] + ":" + failure[:line]
63
+ print $colors[:reset]
64
+ end
65
+ $colors[:failure]
66
+ elsif pending_count > 0
67
+ $colors[:pending]
68
+ else
69
+ $colors[:success]
70
+ end
71
+ puts "\nFinished\n"
72
+ print color
73
+ print ($success_count + failure_count).to_s + ' examples, '
74
+ print failure_count.to_s + ' failures, '
75
+ print pending_count.to_s + ' (or more) pendings'
76
+ puts $colors[:reset]
41
77
  puts
42
- ($failure_count > 0) ? 1 : 0
78
+ (failure_count > 0) ? 1 : 0
43
79
  end
44
80
 
45
81
  <% %w(object hash mock mrubyc_test_case).each do |basename| -%>
@@ -51,10 +87,16 @@ end
51
87
  <% end -%>
52
88
 
53
89
  <% test_files.each do |file_name| -%>
54
- <%= File.read(file_name) %>
90
+ <%= File.read(file_name).gsub(/(\bpend\b)/, '\1;return') -%>
55
91
  <% end -%>
56
92
 
57
93
  <% test_cases.each do |test_case| -%>
94
+ <% case method_name_pattern
95
+ when Regexp
96
+ next unless method_name_pattern.match?(test_case[:information][:method_name])
97
+ when String
98
+ next unless method_name_pattern == test_case[:information][:method_name]
99
+ end -%>
58
100
  <% test_case[:stubs].each do |stub| -%>
59
101
  class <%= stub[:class_name] %>
60
102
  attr_accessor <%= stub[:instance_variables] %>
@@ -94,13 +136,17 @@ end
94
136
  <% end -%>
95
137
  <% end -%>
96
138
  information = <%= test_case[:information].to_s %>
97
- my_case = <%= test_case[:information][:test_class_name] %>.new(information)
139
+ puts
140
+ $current_class_and_method = "<%= test_case[:information][:test_class_name] %>#<%= test_case[:information][:method_name] %>"
141
+ puts $current_class_and_method
142
+ my_case = <%= test_case[:information][:test_class_name] %>.new(information, <%= verbose.to_s %>)
98
143
  my_case.setup
99
144
  my_case.<%= test_case[:information][:method_name] %>
100
145
  <% if test_case[:mocks] -%>
101
146
  my_case.check_mock
102
147
  <% end -%>
103
148
  my_case.teardown
149
+ puts
104
150
 
105
151
  <% end -%>
106
152
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mrubyc-test
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - HASUMI Hitoshi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-01-14 00:00:00.000000000 Z
11
+ date: 2019-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler