test_bench-fixture 1.0.0.0 → 1.2.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11a8f07325bd4895d293ada5d0562bfe183c8913ff1f1ed2fb85bf770f37a34f
4
- data.tar.gz: 3f547833da8e092eeef33a7605621bdd91ac7af38384097dabaacc6eacd493cf
3
+ metadata.gz: 2c2788177e5994201a774ce4374a65458fe9e6e5c5d2d2066000c5034f56b087
4
+ data.tar.gz: 53b44687d4060b69a9b3a4504a6b1c79f954179d29560df78dde4916b73ae4c8
5
5
  SHA512:
6
- metadata.gz: 897778edd91e443502415d4b638517a77835afa40ab53709affab0efd5418b6bb3ce61f2e78bb51782e288bc99c7cd73e98bde4deb7191121e46872d2bb02c48
7
- data.tar.gz: a2041b6063d7cfb1979e49ce84248dc32229bef552448332774e2dd7c450e255ab17be19e0f2ede7f904647537add7e60f8adc0de7f91142499663b1b5141fc4
6
+ metadata.gz: d44875275551502895a4ffa113712e477bdfe7e4e2348f1f28619a7112b7389d8f3b2d8d908aa1ae6af54d67c564a5221b7c880d4d9122b9e9f6d944ac83de5b
7
+ data.tar.gz: 1250a8026381d3c393f407e2799cc33fcc79b523fa070ffe54ee88661296a98150dc98a4a6ff9f1e74000788cd71ccf922763b9a80c6876a7159924973b775ef
@@ -6,13 +6,14 @@ require 'test_bench/fixture/assertion_failure'
6
6
  require 'test_bench/fixture/output'
7
7
  require 'test_bench/fixture/output/null'
8
8
  require 'test_bench/fixture/output/log'
9
+ require 'test_bench/fixture/output/capture'
9
10
  require 'test_bench/fixture/output/substitute'
11
+ require 'test_bench/fixture/output/substitute/scope'
10
12
  require 'test_bench/fixture/output/multiple'
11
13
 
12
14
  require 'test_bench/fixture/error_policy'
13
15
 
14
16
  require 'test_bench/fixture/session'
15
17
  require 'test_bench/fixture/session/substitute'
16
- require 'test_bench/fixture/session/substitute/match_tests'
17
18
 
18
19
  require 'test_bench/fixture/fixture'
@@ -8,3 +8,4 @@ require 'test_bench/fixture/controls/result'
8
8
  require 'test_bench/fixture/controls/test_file'
9
9
 
10
10
  require 'test_bench/fixture/controls/output'
11
+ require 'test_bench/fixture/controls/output/log'
@@ -34,27 +34,27 @@ module TestBench
34
34
  caller_location = Controls::CallerLocation.example
35
35
  error = Controls::Error.example
36
36
  comment_text = 'Some comment'
37
+ detail_text = 'Some detail'
37
38
  test_title = 'Some test'
38
39
  context_title = 'Some Context'
39
40
 
40
41
  {
41
42
  :start => [],
42
- :finish => [result],
43
43
  :enter_file => [path],
44
44
  :exit_file => [path, result],
45
45
  :start_fixture => [fixture],
46
46
  :finish_fixture => [fixture, result],
47
47
  :assert => [result, caller_location],
48
- :enter_assert_block => [caller_location],
49
- :exit_assert_block => [caller_location, result],
50
48
  :comment => [comment_text],
49
+ :detail => [detail_text],
51
50
  :error => [error],
52
51
  :start_test => [test_title],
53
52
  :finish_test => [test_title, result],
54
53
  :skip_test => [test_title],
55
54
  :enter_context => [context_title],
56
55
  :exit_context => [context_title, result],
57
- :skip_context => [context_title]
56
+ :skip_context => [context_title],
57
+ :finish => [result]
58
58
  }.each(&block)
59
59
  end
60
60
  end
@@ -0,0 +1,45 @@
1
+ module TestBench
2
+ module Fixture
3
+ module Controls
4
+ module Output
5
+ module Log
6
+ module Level
7
+ def self.example
8
+ fatal
9
+ end
10
+
11
+ def self.unknown
12
+ :unknown
13
+ end
14
+
15
+ def self.fatal
16
+ :fatal
17
+ end
18
+
19
+ def self.error
20
+ :error
21
+ end
22
+
23
+ def self.warning
24
+ :warning
25
+ end
26
+
27
+ def self.info
28
+ :info
29
+ end
30
+
31
+ def self.debug
32
+ :debug
33
+ end
34
+
35
+ module Invalid
36
+ def self.example
37
+ :not_a_log_level
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -3,6 +3,8 @@ module TestBench
3
3
  Error = Class.new(RuntimeError)
4
4
 
5
5
  def self.build(cls, *args, session: nil, output: nil, error_policy: nil, factory_method: nil, **kwargs, &block)
6
+ assure_fixture(cls)
7
+
6
8
  factory_method = factory_method(cls)
7
9
 
8
10
  if kwargs.empty?
@@ -16,6 +18,12 @@ module TestBench
16
18
  instance
17
19
  end
18
20
 
21
+ def self.assure_fixture(cls)
22
+ unless cls.included_modules.include?(self)
23
+ raise Error, "Not a fixture class (Class: #{cls.inspect})"
24
+ end
25
+ end
26
+
19
27
  def self.factory_method(cls)
20
28
  if cls.respond_to?(:build)
21
29
  cls.method(:build)
@@ -54,19 +62,14 @@ module TestBench
54
62
  test_session.comment(text)
55
63
  end
56
64
 
57
- ArgumentOmitted = Object.new
58
- def assert(value=ArgumentOmitted, caller_location: nil, &block)
59
- caller_location ||= caller_locations.first
65
+ def detail(text)
66
+ test_session.detail(text)
67
+ end
60
68
 
61
- unless value == ArgumentOmitted
62
- unless block.nil?
63
- raise ArgumentError, "Must supply a boolean value or a block (but not both)"
64
- end
69
+ def assert(value, caller_location: nil)
70
+ caller_location ||= caller_locations.first
65
71
 
66
- test_session.assert(value, caller_location: caller_location)
67
- else
68
- test_session.assert_block(caller_location: caller_location, &block)
69
- end
72
+ test_session.assert(value, caller_location: caller_location)
70
73
  end
71
74
 
72
75
  def refute(value, caller_location: nil)
@@ -85,24 +88,30 @@ module TestBench
85
88
 
86
89
  caller_location ||= caller_locations.first
87
90
 
88
- assert(caller_location: caller_location) do
89
- comment "Expected Error: #{error_class}#{' (strict)' if strict}"
90
- comment "Expected Message: #{message.inspect}" unless message.nil?
91
+ detail "Expected Error: #{error_class}#{' (strict)' if strict}"
92
+ detail "Expected Message: #{message.inspect}" unless message.nil?
93
+
94
+ block.()
91
95
 
92
- block.()
96
+ detail "(No error was raised)"
93
97
 
94
- comment "(No error was raised)"
98
+ assert(false, caller_location: caller_location)
95
99
 
96
- rescue error_class => error
100
+ rescue error_class => error
97
101
 
98
- comment "Raised error: #{error.inspect}#{" (subclass of #{error_class})" if error.class < error_class}"
102
+ detail "Raised error: #{error.inspect}#{" (subclass of #{error_class})" if error.class < error_class}"
99
103
 
100
- if strict && !error.instance_of?(error_class)
101
- raise error
102
- end
104
+ if strict && !error.instance_of?(error_class)
105
+ raise error
106
+ end
103
107
 
104
- assert(message.nil? || error.message == message)
108
+ if message.nil?
109
+ result = true
110
+ else
111
+ result = error.message == message
105
112
  end
113
+
114
+ assert(result, caller_location: caller_location)
106
115
  end
107
116
 
108
117
  def refute_raises(error_class=nil, strict: nil, caller_location: nil, &block)
@@ -115,22 +124,27 @@ module TestBench
115
124
 
116
125
  caller_location ||= caller_locations.first
117
126
 
118
- assert(caller_location: caller_location) do
119
- comment "Prohibited Error: #{error_class}#{' (strict)' if strict}"
127
+ detail "Prohibited Error: #{error_class}#{' (strict)' if strict}"
128
+
129
+ block.()
120
130
 
121
- block.()
131
+ detail "(No error was raised)"
122
132
 
123
- comment "(No error was raised)"
133
+ result = true
124
134
 
125
- assert(true)
135
+ rescue error_class => error
126
136
 
127
- rescue error_class => error
137
+ detail "Raised Error: #{error.inspect}"
138
+
139
+ if strict && !error.instance_of?(error_class)
140
+ raise error
141
+ end
128
142
 
129
- comment "Raised Error: #{error.inspect}"
143
+ result = false
130
144
 
131
- if strict && !error.instance_of?(error_class)
132
- raise error
133
- end
145
+ ensure
146
+ unless result.nil?
147
+ assert(result, caller_location: caller_location)
134
148
  end
135
149
  end
136
150
 
@@ -1,6 +1,10 @@
1
1
  module TestBench
2
2
  module Fixture
3
3
  module Output
4
+ def self.signals
5
+ instance_methods(false)
6
+ end
7
+
4
8
  def start
5
9
  end
6
10
 
@@ -22,13 +26,10 @@ module TestBench
22
26
  def assert(result, caller_location)
23
27
  end
24
28
 
25
- def enter_assert_block(caller_location)
26
- end
27
-
28
- def exit_assert_block(result, caller_location)
29
+ def comment(text)
29
30
  end
30
31
 
31
- def comment(text)
32
+ def detail(text)
32
33
  end
33
34
 
34
35
  def error(error)
@@ -0,0 +1,113 @@
1
+ module TestBench
2
+ module Fixture
3
+ module Output
4
+ class Capture
5
+ include Fixture::Output
6
+
7
+ def records
8
+ @records ||= []
9
+ end
10
+
11
+ def current_context
12
+ @current_context ||= []
13
+ end
14
+
15
+ def start
16
+ record(:start)
17
+ end
18
+
19
+ def finish(result)
20
+ record(:finish, result)
21
+ end
22
+
23
+ def enter_file(path)
24
+ record(:enter_file, path)
25
+ end
26
+
27
+ def exit_file(path, result)
28
+ record(:exit_file, path, result)
29
+ end
30
+
31
+ def start_fixture(fixture)
32
+ record(:start_fixture, fixture)
33
+ end
34
+
35
+ def finish_fixture(fixture, result)
36
+ record(:finish_fixture, fixture, result)
37
+ end
38
+
39
+ def assert(result, caller_location)
40
+ record(:assert, result, caller_location)
41
+ end
42
+
43
+ def comment(text)
44
+ record(:comment, text)
45
+ end
46
+
47
+ def detail(text)
48
+ record(:detail, text)
49
+ end
50
+
51
+ def error(error)
52
+ record(:error, error)
53
+ end
54
+
55
+ def start_test(title)
56
+ record(:start_test, title)
57
+ end
58
+
59
+ def finish_test(title, result)
60
+ record(:finish_test, title, result)
61
+ end
62
+
63
+ def skip_test(title)
64
+ record(:skip_test, title)
65
+ end
66
+
67
+ def enter_context(title)
68
+ record = record(:enter_context, title)
69
+
70
+ unless title.nil?
71
+ current_context.push(title)
72
+ end
73
+
74
+ record
75
+ end
76
+
77
+ def exit_context(title, result)
78
+ unless title.nil?
79
+ current_context.pop
80
+ end
81
+
82
+ record(:exit_context, title, result)
83
+ end
84
+
85
+ def skip_context(title)
86
+ record(:skip_context, title)
87
+ end
88
+
89
+ def each_record(&block)
90
+ records.each(&block)
91
+ end
92
+
93
+ def record(signal, *data)
94
+ record = new_record(signal, data)
95
+ records << record
96
+ record
97
+ end
98
+
99
+ def new_record(signal, data)
100
+ context = current_context.dup
101
+
102
+ record = Record.new(signal, data, context)
103
+ end
104
+
105
+ Record = Struct.new(:signal, :data, :context) do
106
+ def forward(receiver)
107
+ receiver.public_send(signal, *data)
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -4,28 +4,65 @@ module TestBench
4
4
  class Log
5
5
  include Output
6
6
 
7
+ Error = Class.new(RuntimeError)
8
+
7
9
  attr_reader :logger
8
10
 
9
11
  def initialize(logger)
10
12
  @logger = logger
11
13
  end
12
14
 
13
- def self.build(device=nil)
15
+ def self.build(device=nil, level: nil)
14
16
  device ||= $stderr
17
+ level ||= self.default_level
18
+
19
+ level_ordinal = level_ordinal(level)
15
20
 
16
21
  logger = Logger.new(device)
22
+ logger.level = level_ordinal
17
23
 
18
24
  new(logger)
19
25
  end
20
26
 
21
- def self.configure(receiver, device=nil, attr_name: nil)
27
+ def self.configure(receiver, device=nil, level: nil, attr_name: nil)
22
28
  attr_name ||= :output
23
29
 
24
- instance = build(device)
30
+ instance = build(device, level: level)
25
31
  receiver.public_send(:"#{attr_name}=", instance)
26
32
  instance
27
33
  end
28
34
 
35
+ def self.default_level
36
+ :debug
37
+ end
38
+
39
+ def self.levels
40
+ level_ordinals.keys
41
+ end
42
+
43
+ def self.level_ordinal(level)
44
+ assure_level(level)
45
+
46
+ level_ordinals.fetch(level)
47
+ end
48
+
49
+ def self.level_ordinals
50
+ {
51
+ :unknown => Logger::Severity::UNKNOWN,
52
+ :fatal => Logger::Severity::FATAL,
53
+ :error => Logger::Severity::ERROR,
54
+ :warning => Logger::Severity::WARN,
55
+ :info => Logger::Severity::INFO,
56
+ :debug => Logger::Severity::DEBUG
57
+ }
58
+ end
59
+
60
+ def self.assure_level(level)
61
+ unless level_ordinals.key?(level)
62
+ raise Error, "Unknown log level #{level.inspect} (Valid levels: #{levels.map(&:inspect) * ', '})"
63
+ end
64
+ end
65
+
29
66
  def start
30
67
  logger.debug { "Start" }
31
68
  end
@@ -54,18 +91,14 @@ module TestBench
54
91
  logger.info { "Assertion (Result: #{result}, Caller Location: #{caller_location})" }
55
92
  end
56
93
 
57
- def enter_assert_block(caller_location)
58
- logger.debug { "Entering assert block (Caller Location: #{caller_location})" }
59
- end
60
-
61
- def exit_assert_block(caller_location, result)
62
- logger.info { "Exited assert block (Caller Location: #{caller_location}, Result: #{result})" }
63
- end
64
-
65
94
  def comment(text)
66
95
  logger.info { "Comment (Text: #{text})" }
67
96
  end
68
97
 
98
+ def detail(text)
99
+ logger.debug { "Detail (Text: #{text})" }
100
+ end
101
+
69
102
  def error(error)
70
103
  logger.error { "Error (Error: #{error})" }
71
104
  end
@@ -8,132 +8,105 @@ module TestBench
8
8
 
9
9
  MatchError = Class.new(RuntimeError)
10
10
 
11
- class Output
12
- include Fixture::Output
11
+ class Output < Capture
12
+ alias_method :raw_records, :records
13
13
 
14
- def records
15
- @records ||= []
16
- end
17
-
18
- def start
19
- record(:start)
20
- end
14
+ def scope(*contexts, &block)
15
+ records = records(*contexts, &block)
21
16
 
22
- def finish(result)
23
- record(:finish, result)
17
+ Scope.build(records)
24
18
  end
25
19
 
26
- def enter_file(path)
27
- record(:enter_file, path)
28
- end
20
+ def recorded_once?(*contexts, &block)
21
+ record = one_record(*contexts, &block)
29
22
 
30
- def exit_file(path, result)
31
- record(:exit_file, path, result)
23
+ record ? true : false
32
24
  end
33
25
 
34
- def start_fixture(fixture)
35
- record(:start_fixture, fixture)
36
- end
26
+ def recorded?(*contexts, &block)
27
+ records = match_records(*contexts, &block)
37
28
 
38
- def finish_fixture(fixture, result)
39
- record(:finish_fixture, fixture, result)
29
+ records.any?
40
30
  end
41
31
 
42
- def assert(result, caller_location)
43
- record(:assert, result, caller_location)
44
- end
32
+ def one_record(*contexts, &block)
33
+ matching_records = match_records(*contexts, &block)
45
34
 
46
- def enter_assert_block(caller_location)
47
- record(:enter_assert_block, caller_location)
48
- end
49
-
50
- def exit_assert_block(caller_location, result)
51
- record(:exit_assert_block, caller_location, result)
52
- end
53
-
54
- def comment(text)
55
- record(:comment, text)
56
- end
35
+ return if matching_records.empty?
57
36
 
58
- def error(error)
59
- record(:error, error)
60
- end
37
+ unless matching_records.one?
38
+ raise MatchError, "More than one records match"
39
+ end
61
40
 
62
- def start_test(title)
63
- record(:start_test, title)
41
+ matching_records.shift
64
42
  end
65
43
 
66
- def finish_test(title, result)
67
- record(:finish_test, title, result)
68
- end
44
+ def records(*contexts, &block)
45
+ if contexts.empty? && block.nil?
46
+ return raw_records
47
+ end
69
48
 
70
- def skip_test(title)
71
- record(:skip_test, title)
49
+ match_records(*contexts, &block)
72
50
  end
73
51
 
74
- def enter_context(title)
75
- record(:enter_context, title)
76
- end
52
+ def match_records(*contexts, &block)
53
+ block ||= proc { true }
77
54
 
78
- def exit_context(title, result)
79
- record(:exit_context, title, result)
80
- end
55
+ raw_records.select do |record|
56
+ context_iterator = record.context.to_enum
81
57
 
82
- def skip_context(title)
83
- record(:skip_context, title)
84
- end
58
+ contexts_match = contexts.all? do |context|
59
+ until context_iterator.peek == context
60
+ context_iterator.next
61
+ end
62
+ true
85
63
 
86
- def record(signal, *data)
87
- record = Record.new(signal, data)
88
- records << record
89
- record
90
- end
64
+ rescue StopIteration
65
+ false
66
+ end
91
67
 
92
- def replay_records(output)
93
- records.each do |record|
94
- output.public_send(record.signal, *record.data)
68
+ contexts_match &&
69
+ block.(record.signal, *record.data, record.context)
95
70
  end
96
71
  end
97
72
 
98
- def recorded?(signal=nil, &block)
99
- matching_records(signal, &block).any?
100
- end
101
-
102
- def recorded_once?(signal=nil, &block)
103
- one_record(signal, &block) ? true : false
104
- end
105
-
106
- def one_record(signal=nil, &block)
107
- matching_records = matching_records(signal, &block)
108
-
109
- return if matching_records.empty?
110
-
111
- unless matching_records.one?
112
- raise MatchError, "More than one records match"
73
+ Fixture::Output.signals.each do |signal|
74
+ signal_records_method = :"#{signal}_records" # e.g. comment_records
75
+ define_method(signal_records_method) do |*contexts, &block|
76
+ match_records(*contexts) do |recorded_signal, *data|
77
+ if recorded_signal == signal
78
+ block.nil? || block.(*data)
79
+ end
80
+ end
113
81
  end
114
82
 
115
- matching_records.shift
116
- end
117
-
118
- def matching_records(signal=nil, &block)
119
- unless signal.nil?
120
- inner_block = block || proc { true }
83
+ one_signal_method = :"one_#{signal}_record" # e.g. one_comment_record
84
+ define_method(one_signal_method) do |*contexts, &block|
85
+ one_record(*contexts) do |recorded_signal, *data|
86
+ if recorded_signal == signal
87
+ block.nil? || block.(*data)
88
+ end
89
+ end
90
+ end
121
91
 
122
- block = proc { |sig, *data|
123
- if sig == signal
124
- inner_block.(*data)
125
- else
126
- false
92
+ signal_recorded_method = :"#{signal}_recorded?" # e.g. comment_recorded?
93
+ define_method(signal_recorded_method) do |*contexts, &block|
94
+ recorded?(*contexts) do |recorded_signal, *data|
95
+ if recorded_signal == signal
96
+ block.nil? || block.(*data)
127
97
  end
128
- }
98
+ end
129
99
  end
130
100
 
131
- records.select do |record|
132
- block.(record.signal, *record.data)
101
+ signal_recorded_once_method = :"#{signal}_recorded_once?" # e.g. comment_recorded_once?
102
+ define_method(signal_recorded_once_method) do |*contexts, &block|
103
+ recorded_once?(*contexts) do |recorded_signal, *data|
104
+ if recorded_signal == signal
105
+ block.nil? || block.(*data)
106
+ end
107
+ end
133
108
  end
134
109
  end
135
-
136
- Record = Struct.new(:signal, :data)
137
110
  end
138
111
  end
139
112
  end
@@ -0,0 +1,26 @@
1
+ module TestBench
2
+ module Fixture
3
+ module Output
4
+ module Substitute
5
+ class Output
6
+ class Scope < Output
7
+ attr_writer :records
8
+
9
+ def self.build(records)
10
+ instance = new
11
+ instance.records = records
12
+ instance
13
+ end
14
+
15
+ def combine(scope)
16
+ combined_records = self.records + scope.records
17
+
18
+ Scope.build(combined_records)
19
+ end
20
+ alias_method :+, :combine
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -13,6 +13,12 @@ module TestBench
13
13
  end
14
14
  attr_writer :error_counter
15
15
 
16
+ def skip
17
+ @skip ||= false
18
+ end
19
+ attr_writer :skip
20
+ alias_method :skip?, :skip
21
+
16
22
  def started
17
23
  instance_variable_defined?(:@started) ?
18
24
  @started :
@@ -95,6 +101,10 @@ module TestBench
95
101
  output.comment(text)
96
102
  end
97
103
 
104
+ def detail(text)
105
+ output.detail(text)
106
+ end
107
+
98
108
  def error(error)
99
109
  fail!
100
110
 
@@ -122,35 +132,6 @@ module TestBench
122
132
  result
123
133
  end
124
134
 
125
- def assert_block(caller_location: nil, &block)
126
- caller_location ||= caller_locations.first
127
-
128
- previous_error_counter = self.error_counter
129
- previous_assertion_counter = self.assertion_counter
130
-
131
- output.enter_assert_block(caller_location)
132
-
133
- begin
134
- block.()
135
-
136
- ensure
137
- if self.error_counter > previous_error_counter
138
- result = false
139
- elsif self.assertion_counter == previous_assertion_counter
140
- result = false
141
- else
142
- result = true
143
- end
144
-
145
- output.exit_assert_block(caller_location, result)
146
-
147
- current_exception = $!
148
- if current_exception.nil? || current_exception.instance_of?(AssertionFailure)
149
- assert(result, caller_location: caller_location)
150
- end
151
- end
152
- end
153
-
154
135
  def load(path)
155
136
  output.enter_file(path)
156
137
 
@@ -171,7 +152,17 @@ module TestBench
171
152
 
172
153
  output.start_test(title)
173
154
 
174
- evaluate(block) do |result|
155
+ previous_assertion_counter = self.assertion_counter
156
+
157
+ action = proc {
158
+ block.()
159
+
160
+ unless assertion_counter > previous_assertion_counter
161
+ raise Error, "Test did not perform an assertion"
162
+ end
163
+ }
164
+
165
+ evaluate(action) do |result|
175
166
  output.finish_test(title, result)
176
167
  end
177
168
  end
@@ -235,12 +226,17 @@ module TestBench
235
226
  end
236
227
 
237
228
  def fail!
229
+ self.assertion_counter += 1
238
230
  self.error_counter += 1
239
231
  end
240
232
 
241
233
  def failed?
242
234
  error_counter.nonzero? ? true : false
243
235
  end
236
+
237
+ def skip!
238
+ self.skip = true
239
+ end
244
240
  end
245
241
  end
246
242
  end
@@ -7,117 +7,118 @@ module TestBench
7
7
  end
8
8
 
9
9
  class Session < Session
10
- Error = Class.new(RuntimeError)
10
+ def scope(*contexts)
11
+ scoped_output = output.scope(*contexts)
11
12
 
12
- attr_accessor :load_failure
13
+ return nil if scoped_output.records.empty?
13
14
 
14
- def commented?(text)
15
- output.recorded?(:comment) do |t|
16
- t == text
17
- end
15
+ scoped_session = self.class.new
16
+ scoped_session.output = scoped_output
17
+ scoped_session
18
18
  end
19
+ alias_method :[], :scope
19
20
 
20
- def asserted?(result=nil, caller_location: nil)
21
- output.recorded?(:assert) do |r, cl|
22
- (result.nil? || r == result) &&
23
- (caller_location.nil? || cl == caller_location)
21
+ def context?(*outer_contexts, title)
22
+ output.exit_context_recorded_once?(*outer_contexts) do |t|
23
+ t == title
24
24
  end
25
25
  end
26
26
 
27
- def load_failure!
28
- self.load_failure = true
27
+ def one_test_passed?(*contexts, title)
28
+ one_test?(*contexts, title) do |_, result|
29
+ result == true
30
+ end
29
31
  end
30
32
 
31
- def load(path)
32
- result = load_failure ? false : true
33
-
34
- output.enter_file(path)
33
+ def one_test_failed?(*contexts, title)
34
+ one_test?(*contexts, title) do |_, result|
35
+ result == false
36
+ end
37
+ end
35
38
 
36
- output.exit_file(path, result)
39
+ def one_test?(*contexts, title, &block)
40
+ test_scope = test_scope(*contexts, title)
37
41
 
38
- result
42
+ test_scope.finish_test_recorded_once?(&block)
39
43
  end
40
44
 
41
- def loaded?(path)
42
- output.recorded?(:exit_file) do |p|
43
- p == path
45
+ def any_test_passed?(*contexts, title)
46
+ any_test?(*contexts, title) do |_, result|
47
+ result == true
44
48
  end
45
49
  end
50
+ alias_method :test_passed?, :any_test_passed?
46
51
 
47
- def test?(title)
48
- output.recorded?(:finish_test) do |t|
49
- t == title
52
+ def any_test_failed?(*contexts, title)
53
+ any_test?(*contexts, title) do |_, result|
54
+ result == false
50
55
  end
51
56
  end
57
+ alias_method :test_failed?, :any_test_failed?
52
58
 
53
- def context?(title)
54
- output.recorded?(:exit_context) do |t|
55
- t == title
56
- end
59
+ def any_test?(*contexts, title, &block)
60
+ test_scope = test_scope(*contexts, title)
61
+
62
+ test_scope.finish_test_recorded?(&block)
57
63
  end
64
+ alias_method :test?, :any_test?
58
65
 
59
- def fixture?(fixture)
60
- output.recorded?(:finish_fixture) do |f|
61
- f == fixture
66
+ def commented?(*contexts, text)
67
+ output.comment_recorded?(*contexts) do |t|
68
+ t == text
62
69
  end
63
70
  end
64
71
 
65
- def passed?(*titles)
66
- !pass(*titles).nil?
72
+ def detail?(*contexts, text)
73
+ output.detail_recorded?(*contexts) do |t|
74
+ t == text
75
+ end
67
76
  end
68
77
 
69
- def failed?(*titles)
70
- return super if titles.empty?
78
+ def asserted?(*contexts, result: nil, caller_location: nil)
79
+ output.assert_recorded?(*contexts) do |r, cl|
80
+ result_match = result.nil? || r == result
81
+ caller_location_match = caller_location.nil? || cl == caller_location
71
82
 
72
- !failure(*titles).nil?
83
+ result_match && caller_location_match
84
+ end
73
85
  end
74
86
 
75
- def one_pass(*titles)
76
- passes = passes(*titles)
77
-
78
- if passes.count > 1
79
- raise Error, "Multiple passing tests match (Titles: #{titles.inspect})"
80
- end
87
+ def load(path)
88
+ output.enter_file(path)
81
89
 
82
- passes.first
83
- end
90
+ inert_action = proc { }
91
+ result = evaluate(inert_action)
84
92
 
85
- def one_passed?(*titles)
86
- one_pass(*titles) ? true : false
87
- end
93
+ output.exit_file(path, result)
88
94
 
89
- def pass(*titles)
90
- passes(*titles).first
95
+ result
91
96
  end
92
97
 
93
- def passes(*titles)
94
- match_tests(*titles, result: true)
98
+ def loaded?(path=nil)
99
+ output.enter_file_recorded? do |p|
100
+ path.nil? || p == path
101
+ end
95
102
  end
96
103
 
97
- def one_failure(*titles)
98
- failures = failures(*titles)
99
-
100
- if failures.count > 1
101
- raise Error, "Multiple failing tests match (Titles: #{titles.inspect})"
104
+ def fixture?(fixture)
105
+ output.finish_fixture_recorded? do |f|
106
+ f == fixture
102
107
  end
103
-
104
- failures.first
105
108
  end
106
109
 
107
- def one_failed?(*titles)
108
- one_failure(*titles) ? true : false
109
- end
110
+ def test_scope(*contexts, title)
111
+ context_scope = output.scope(*contexts)
110
112
 
111
- def failure(*titles)
112
- failures(*titles).first
113
- end
113
+ titled_test_scope = context_scope.scope do |signal, t|
114
+ signal == :finish_test && t == title
115
+ end
114
116
 
115
- def failures(*titles)
116
- match_tests(*titles, result: false)
117
- end
117
+ untitled_test_scope = context_scope.scope(title) do |signal, t|
118
+ signal == :finish_test && t.nil?
119
+ end
118
120
 
119
- def match_tests(*titles, result: nil)
120
- MatchTests.(self, *titles, result: result)
121
+ titled_test_scope + untitled_test_scope
121
122
  end
122
123
  end
123
124
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test_bench-fixture
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.0
4
+ version: 1.2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Ladd
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-09 00:00:00.000000000 Z
11
+ date: 2020-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test_bench-bootstrap
@@ -24,7 +24,7 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- description:
27
+ description:
28
28
  email: nathanladd+github@gmail.com
29
29
  executables: []
30
30
  extensions: []
@@ -38,23 +38,25 @@ files:
38
38
  - lib/test_bench/fixture/controls/error/backtrace.rb
39
39
  - lib/test_bench/fixture/controls/fixture.rb
40
40
  - lib/test_bench/fixture/controls/output.rb
41
+ - lib/test_bench/fixture/controls/output/log.rb
41
42
  - lib/test_bench/fixture/controls/result.rb
42
43
  - lib/test_bench/fixture/controls/test_file.rb
43
44
  - lib/test_bench/fixture/error_policy.rb
44
45
  - lib/test_bench/fixture/fixture.rb
45
46
  - lib/test_bench/fixture/output.rb
47
+ - lib/test_bench/fixture/output/capture.rb
46
48
  - lib/test_bench/fixture/output/log.rb
47
49
  - lib/test_bench/fixture/output/multiple.rb
48
50
  - lib/test_bench/fixture/output/null.rb
49
51
  - lib/test_bench/fixture/output/substitute.rb
52
+ - lib/test_bench/fixture/output/substitute/scope.rb
50
53
  - lib/test_bench/fixture/session.rb
51
54
  - lib/test_bench/fixture/session/substitute.rb
52
- - lib/test_bench/fixture/session/substitute/match_tests.rb
53
55
  homepage: https://github.com/test-bench/test-bench-fixture
54
56
  licenses:
55
57
  - MIT
56
58
  metadata: {}
57
- post_install_message:
59
+ post_install_message:
58
60
  rdoc_options: []
59
61
  require_paths:
60
62
  - lib
@@ -69,8 +71,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
71
  - !ruby/object:Gem::Version
70
72
  version: '0'
71
73
  requirements: []
72
- rubygems_version: 3.1.2
73
- signing_key:
74
+ rubygems_version: 3.1.4
75
+ signing_key:
74
76
  specification_version: 4
75
77
  summary: Test object framework
76
78
  test_files: []
@@ -1,131 +0,0 @@
1
- module TestBench
2
- module Fixture
3
- class Session
4
- module Substitute
5
- class MatchTests
6
- include Output
7
-
8
- attr_reader :output_substitute
9
- attr_reader :patterns
10
- attr_reader :result
11
-
12
- def matches
13
- @matches ||= []
14
- end
15
-
16
- def stack
17
- @stack ||= []
18
- end
19
-
20
- def pattern_index
21
- @pattern_index ||= 0
22
- end
23
- attr_writer :pattern_index
24
-
25
- def initialize(output_substitute, result, *patterns)
26
- @output_substitute = output_substitute
27
- @result = result
28
- @patterns = patterns
29
- end
30
-
31
- def self.build(run, *patterns, result: nil)
32
- output_substitute = run.output
33
-
34
- patterns.map! do |pattern|
35
- if pattern.is_a?(String)
36
- Regexp.new("\\A#{Regexp.escape(pattern)}\\z")
37
- else
38
- pattern
39
- end
40
- end
41
-
42
- new(output_substitute, result, *patterns)
43
- end
44
-
45
- def self.call(run, *patterns, result: nil)
46
- instance = build(run, *patterns, result: result)
47
- instance.()
48
- end
49
-
50
- def call
51
- output_substitute.replay_records(self)
52
-
53
- matches
54
- end
55
-
56
- def enter_context(title)
57
- push(title)
58
- end
59
-
60
- def exit_context(_, _)
61
- pop
62
- end
63
-
64
- def finish_test(title, result)
65
- push(title)
66
-
67
- if match?(result)
68
- text = stack.join("\t")
69
-
70
- matches << text
71
- end
72
-
73
- pop unless title.nil?
74
- end
75
-
76
- def skip_test(title)
77
- push(title)
78
-
79
- pop
80
- end
81
-
82
- def push(title)
83
- return if title.nil?
84
-
85
- if next_pattern.match?(title)
86
- self.pattern_index += 1
87
- end
88
-
89
- stack.push(title)
90
- end
91
-
92
- def pop
93
- title = stack.pop
94
-
95
- if previous_pattern.match?(title)
96
- self.pattern_index -= 1
97
- end
98
- end
99
-
100
- def match?(result)
101
- return false unless pattern_index == patterns.count
102
-
103
- if self.result.nil?
104
- true
105
- else
106
- result == self.result
107
- end
108
- end
109
-
110
- def next_pattern
111
- return Pattern.none if pattern_index == patterns.count
112
-
113
- patterns.fetch(pattern_index)
114
- end
115
-
116
- def previous_pattern
117
- return Pattern.none if pattern_index.zero?
118
-
119
- patterns[pattern_index - 1]
120
- end
121
-
122
- module Pattern
123
- def self.none
124
- %r{\z\A}
125
- end
126
- end
127
- end
128
- end
129
- end
130
- end
131
- end