ankit 0.0.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.
- data/bin/ankit +6 -0
- data/lib/ankit/add_command.rb +28 -0
- data/lib/ankit/card.rb +66 -0
- data/lib/ankit/card_happening_command.rb +31 -0
- data/lib/ankit/challenge_command.rb +444 -0
- data/lib/ankit/coming_command.rb +90 -0
- data/lib/ankit/command.rb +40 -0
- data/lib/ankit/event.rb +62 -0
- data/lib/ankit/event_traversing_command.rb +37 -0
- data/lib/ankit/fail_command.rb +14 -0
- data/lib/ankit/find_command.rb +38 -0
- data/lib/ankit/hello_command.rb +22 -0
- data/lib/ankit/list_command.rb +26 -0
- data/lib/ankit/name_command.rb +16 -0
- data/lib/ankit/pass_command.rb +9 -0
- data/lib/ankit/round_command.rb +31 -0
- data/lib/ankit/runtime.rb +151 -0
- data/lib/ankit/score_command.rb +24 -0
- data/lib/ankit/text_reading_command.rb +23 -0
- data/lib/ankit.rb +3 -0
- data/test/card_test.rb +92 -0
- data/test/command_test.rb +406 -0
- data/test/data/bye_card.card +2 -0
- data/test/data/hello_card.card +2 -0
- data/test/data/hello_config.rb +4 -0
- data/test/data/hello_repo/anemone.journal +2 -0
- data/test/data/hello_repo/baobab.journal +2 -0
- data/test/data/hello_repo/cards/foo/hello.card +2 -0
- data/test/data/hello_repo/cards/foo/this_is_not_a_card.txt +1 -0
- data/test/data/hello_repo/cards/foo/vanilla-please.card +2 -0
- data/test/data/hope.card +1 -0
- data/test/data/luck.card +1 -0
- data/test/data/number_repo/anemone.journal +0 -0
- data/test/data/number_repo/cards/eight.card +2 -0
- data/test/data/number_repo/cards/five.card +2 -0
- data/test/data/number_repo/cards/four.card +2 -0
- data/test/data/number_repo/cards/one.card +2 -0
- data/test/data/number_repo/cards/seven.card +2 -0
- data/test/data/number_repo/cards/six.card +2 -0
- data/test/data/number_repo/cards/three.card +2 -0
- data/test/data/number_repo/cards/two.card +2 -0
- data/test/data/vanilla_repo/anemone.journal +0 -0
- data/test/event_test.rb +29 -0
- data/test/helpers.rb +54 -0
- data/test/progress_test.rb +99 -0
- data/test/runtime_test.rb +58 -0
- metadata +138 -0
@@ -0,0 +1,406 @@
|
|
1
|
+
|
2
|
+
require 'ankit/runtime'
|
3
|
+
|
4
|
+
require 'test/unit'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'tmpdir'
|
7
|
+
require 'mocha'
|
8
|
+
|
9
|
+
class CommandTest < Test::Unit::TestCase
|
10
|
+
include Ankit
|
11
|
+
|
12
|
+
def test_available
|
13
|
+
assert(Command::COMMANDS.include?(HelloCommand))
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_command_names
|
17
|
+
assert_equal(Command.by_name["hello"], HelloCommand)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class ListTest < Test::Unit::TestCase
|
22
|
+
include Ankit
|
23
|
+
include Ankit::TestHelper
|
24
|
+
|
25
|
+
def test_hello
|
26
|
+
lines = make_runtime.dispatch_then(["hello"]).printed_lines
|
27
|
+
a_subpath = File.join(HELLO_REPO, "cards", "foo")
|
28
|
+
assert(lines.include?("card_search_paths: #{a_subpath}"))
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_list
|
32
|
+
lines = make_runtime.dispatch_then(["list"]).printed_lines
|
33
|
+
assert( lines.include?(File.join(HELLO_REPO, "cards", "foo", "hello.card")))
|
34
|
+
assert(!lines.include?(File.join(HELLO_REPO, "cards", "foo")))
|
35
|
+
not_a_card = File.join(HELLO_REPO, "cards", "foo", "this_is_not_a_card.txt")
|
36
|
+
assert( File.file?(not_a_card))
|
37
|
+
assert(!lines.include?(not_a_card))
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class FindTest < Test::Unit::TestCase
|
42
|
+
include Ankit
|
43
|
+
include Ankit::TestHelper
|
44
|
+
|
45
|
+
def test_hello
|
46
|
+
assert_equal(make_runtime.dispatch_then(["find", "vanilla-please", "hello", "no-such-card"]).printed_lines,
|
47
|
+
[repo_data_at("cards/foo/vanilla-please.card"),
|
48
|
+
repo_data_at("cards/foo/hello.card")])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class NameTest < Test::Unit::TestCase
|
53
|
+
include Ankit
|
54
|
+
include Ankit::TestHelper
|
55
|
+
|
56
|
+
def test_bad_options
|
57
|
+
assert_raise(BadOptions) do
|
58
|
+
target = make_runtime
|
59
|
+
target.dispatch(["name", "--stdin", "hello"])
|
60
|
+
end
|
61
|
+
|
62
|
+
assert_raise(BadOptions) do
|
63
|
+
target = make_runtime
|
64
|
+
target.dispatch(["name"])
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_stdin
|
69
|
+
target = make_runtime
|
70
|
+
target.stdin.string << "O: Hello!\n\n"
|
71
|
+
assert_equal(target.dispatch_then(["name", "--stdin"]).printed_line, "hello")
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_hello
|
75
|
+
target = make_runtime
|
76
|
+
target.dispatch(["name", test_data_at("hello_card.card"), test_data_at("bye_card.card")])
|
77
|
+
assert_equal(target.printed_lines, ["hello-world", "bye-universe"])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class ScoreTest < Test::Unit::TestCase
|
82
|
+
include Ankit
|
83
|
+
include Ankit::TestHelper
|
84
|
+
|
85
|
+
def test_each_event
|
86
|
+
target = ScoreCommand.new(make_runtime, [])
|
87
|
+
all = target.to_enum(:each_event).to_a
|
88
|
+
assert_equal(all.size, 4)
|
89
|
+
assert_equal(all[0].class, Event)
|
90
|
+
assert_equal(target.to_enum(:each_event, "hello").to_a.size, 2)
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_hello
|
94
|
+
target = make_runtime
|
95
|
+
target.dispatch(["score", repo_data_at("to_cards/foo/hello.card")])
|
96
|
+
assert_equal(2, target.printed_lines.size)
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_find_dup
|
100
|
+
target = make_runtime
|
101
|
+
latest = EventTraversing.find_latest_event_for(target, repo_data_at("to_cards/foo/hello.card"))
|
102
|
+
assert_equal(latest.round, 6)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
class RoundTest < Test::Unit::TestCase
|
108
|
+
include Ankit
|
109
|
+
include Ankit::TestHelper
|
110
|
+
|
111
|
+
def test_hello
|
112
|
+
assert_equal(make_runtime.dispatch_then(["round"]).printed_line, "6 9")
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_vanilla
|
116
|
+
assert_equal(make_vanilla_runtime.dispatch_then(["round"]).printed_line, "0 0")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
class AddTest < Test::Unit::TestCase
|
121
|
+
include Ankit
|
122
|
+
include Ankit::TestHelper
|
123
|
+
|
124
|
+
THE_TEXT = "O:There is no Frigate like a Book\n"
|
125
|
+
THE_NAME = "there-is-no-frigate-like-a-book.card"
|
126
|
+
|
127
|
+
def assert_written(runtime, paths)
|
128
|
+
assert_equal(paths.size, runtime.printed_lines.size)
|
129
|
+
runtime.printed_lines.zip(paths).each do |line, path|
|
130
|
+
assert_equal(path, line)
|
131
|
+
assert(File.file?(path))
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_hello_stdin
|
136
|
+
with_runtime_on_temp_repo do |target|
|
137
|
+
target.stdin.string << THE_TEXT
|
138
|
+
assert_written(target.dispatch_then(["add", "--stdin"]),
|
139
|
+
[File.join(target.config.card_paths[0], THE_NAME)])
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_hello_stdin_dir
|
144
|
+
with_runtime_on_temp_repo do |target|
|
145
|
+
target.stdin.string << THE_TEXT
|
146
|
+
dst_dir = target.config.card_search_paths[1]
|
147
|
+
assert_written(target.dispatch_then(["add", "--stdin", "--dir", dst_dir]),
|
148
|
+
[File.join(dst_dir, THE_NAME)])
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_hello_two_file
|
153
|
+
with_runtime_on_temp_repo do |target|
|
154
|
+
dst_dir = target.config.card_search_paths[1]
|
155
|
+
assert_written(target.dispatch_then(["add", test_data_at("hope.card"), test_data_at("luck.card")]),
|
156
|
+
[File.join(target.config.card_paths[0], "hope-is-the-thing-with-feathers.card"),
|
157
|
+
File.join(target.config.card_paths[0], "luck-is-not-chance.card")])
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
class ComingTest < Test::Unit::TestCase
|
163
|
+
include Ankit
|
164
|
+
include Ankit::TestHelper
|
165
|
+
include Ankit::CardNaming
|
166
|
+
|
167
|
+
def test_name
|
168
|
+
with_runtime_on_temp_repo do |target|
|
169
|
+
assert_equal(target.dispatch_then(["coming", "--name"]).printed_lines,
|
170
|
+
["vanilla-please", "bye", "how-are-you", "hello"])
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_limit
|
175
|
+
with_runtime_on_temp_repo do |target|
|
176
|
+
|
177
|
+
assert_equal(target.dispatch_then(["coming", "--name", "1"]).printed_lines,
|
178
|
+
["vanilla-please"])
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_hello
|
183
|
+
with_runtime_on_temp_repo do |target|
|
184
|
+
dir = File.join(target.config.repo, "cards/foo")
|
185
|
+
assert_equal(target.dispatch_then(["coming"]).printed_lines,
|
186
|
+
[to_card_path(dir, "vanilla-please"),
|
187
|
+
to_card_path(dir, "hello")])
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
class FailPassTest < Test::Unit::TestCase
|
193
|
+
include Ankit
|
194
|
+
include Ankit::TestHelper
|
195
|
+
include Ankit::CardNaming, Ankit::Coming
|
196
|
+
|
197
|
+
VANILLA = "vanilla-please"
|
198
|
+
JUNIOR = "bye"
|
199
|
+
MIDDLE = "how-are-you"
|
200
|
+
VINTAGE = "hello"
|
201
|
+
|
202
|
+
def path_for(runtime, name)
|
203
|
+
dir = File.join(runtime.config.repo, "cards/foo")
|
204
|
+
to_card_path(dir, name)
|
205
|
+
end
|
206
|
+
|
207
|
+
def run_test_against(command, card, &block)
|
208
|
+
with_runtime_on_temp_repo do |target|
|
209
|
+
path = path_for(target, card)
|
210
|
+
target.dispatch([command, path])
|
211
|
+
assert_equal(target.printed_lines.size, 1)
|
212
|
+
events = Coming.coming_events(target)
|
213
|
+
block.call(events)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_pass_vanilla
|
218
|
+
run_test_against("pass", VANILLA) do |events|
|
219
|
+
assert_equal(events[0].name, VANILLA)
|
220
|
+
assert_equal(events[0].maturity, 1)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
def test_pass_vintage
|
225
|
+
run_test_against("pass", VINTAGE) do |events|
|
226
|
+
assert_equal(events.map(&:name), [VANILLA, JUNIOR, MIDDLE, VINTAGE])
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_pass_junior
|
231
|
+
run_test_against("pass", JUNIOR) do |events|
|
232
|
+
assert_equal(events.map(&:name), [VANILLA, MIDDLE, JUNIOR, VINTAGE])
|
233
|
+
assert_equal(events[2].maturity, 3)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def test_fail_vanilla
|
238
|
+
run_test_against("fail", VANILLA) do |events|
|
239
|
+
assert_equal(events[0].name, VANILLA)
|
240
|
+
assert_equal(events[0].maturity, 0)
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
def test_fail_vintage
|
245
|
+
run_test_against("fail", VINTAGE) do |events|
|
246
|
+
assert_equal(events.map(&:name), [VANILLA, VINTAGE, JUNIOR, MIDDLE])
|
247
|
+
assert_equal(events[0].maturity, 0)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
class ChallengeTest < Test::Unit::TestCase
|
253
|
+
include Ankit
|
254
|
+
include Ankit::TestHelper
|
255
|
+
include Ankit::CardNaming, Ankit::Coming
|
256
|
+
|
257
|
+
def test_initial_state
|
258
|
+
with_runtime_on_temp_repo do |target|
|
259
|
+
actual = ChallengeCommand.new(target).initial_state
|
260
|
+
assert_instance_of(Challenge::QuestionState, actual)
|
261
|
+
assert_equal(2, actual.progress.slots.size)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
def test_initial_state_limit_default
|
266
|
+
runtime = make_runtime(NUMBER_REPO)
|
267
|
+
actual = runtime.make_command(["challenge"]).initial_state
|
268
|
+
assert_equal(actual.progress.size, ChallengeCommand::DEFAULT_COUNT)
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_initial_state_limit_args
|
272
|
+
runtime = make_runtime(NUMBER_REPO)
|
273
|
+
actual = runtime.make_command(["challenge", "--limit", "2"]).initial_state
|
274
|
+
assert_equal(actual.progress.size, 2)
|
275
|
+
end
|
276
|
+
|
277
|
+
FIRST_CORRECT_ANSWER = "Vanilla, Please?"
|
278
|
+
SECOND_CORRECT_ANSWER = "Hello"
|
279
|
+
FIRST_WRONG_ANSWER = "Doesn't Match"
|
280
|
+
FIRST_TYPO_ANSWER = "Vanilla, Please!"
|
281
|
+
|
282
|
+
def hit_return_pump(state)
|
283
|
+
state.progress.runtime.line = HighLine.new
|
284
|
+
state.progress.runtime.line.stubs(:say).at_least(0)
|
285
|
+
state.progress.runtime.line.stubs(:ask).once()
|
286
|
+
state.pump
|
287
|
+
end
|
288
|
+
|
289
|
+
def enter_text_pump(state, text)
|
290
|
+
state.progress.runtime.line = HighLine.new
|
291
|
+
state.progress.runtime.line.stubs(:say).at_least(1)
|
292
|
+
state.progress.runtime.line.stubs(:ask).once().returns(text)
|
293
|
+
state.pump
|
294
|
+
end
|
295
|
+
|
296
|
+
def agree_pump(state, that)
|
297
|
+
state.progress.runtime.line = HighLine.new
|
298
|
+
state.progress.runtime.line.stubs(:say).at_least(0)
|
299
|
+
state.progress.runtime.line.stubs(:ask).once().returns(that)
|
300
|
+
state.pump
|
301
|
+
end
|
302
|
+
|
303
|
+
def test_question_to_fail
|
304
|
+
with_runtime_on_temp_repo do |runtime|
|
305
|
+
actual = ChallengeCommand.new(runtime).initial_state
|
306
|
+
actual_next = enter_text_pump(actual, FIRST_WRONG_ANSWER)
|
307
|
+
assert_instance_of(Challenge::FailedState, actual_next)
|
308
|
+
actual_next = hit_return_pump(actual_next)
|
309
|
+
assert_instance_of(Challenge::QuestionState, actual_next)
|
310
|
+
assert_equal(actual_next.progress.npassed, 0)
|
311
|
+
assert_equal(actual_next.progress.nfailed, 1)
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
def test_question_to_typo
|
316
|
+
with_runtime_on_temp_repo do |runtime|
|
317
|
+
actual = ChallengeCommand.new(runtime).initial_state
|
318
|
+
actual_next = enter_text_pump(actual, FIRST_TYPO_ANSWER)
|
319
|
+
assert_instance_of(Challenge::TypoState, actual_next)
|
320
|
+
actual_next = hit_return_pump(actual_next)
|
321
|
+
assert_instance_of(Challenge::QuestionState, actual_next)
|
322
|
+
assert_equal(actual_next.progress.npassed, 0)
|
323
|
+
assert_equal(actual_next.progress.nfailed, 0)
|
324
|
+
actual_next = enter_text_pump(actual_next, FIRST_CORRECT_ANSWER)
|
325
|
+
assert_instance_of(Challenge::PassedState, actual_next)
|
326
|
+
hit_return_pump(actual_next)
|
327
|
+
assert_equal(actual_next.progress.npassed, 1)
|
328
|
+
assert_equal(actual_next.progress.nfailed, 0)
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
def test_question_to_pass
|
333
|
+
with_runtime_on_temp_repo do |runtime|
|
334
|
+
actual = ChallengeCommand.new(runtime).initial_state
|
335
|
+
actual_next = enter_text_pump(actual, FIRST_CORRECT_ANSWER)
|
336
|
+
assert_instance_of(Challenge::PassedState, actual_next)
|
337
|
+
actual_next = hit_return_pump(actual_next)
|
338
|
+
assert_instance_of(Challenge::QuestionState, actual_next)
|
339
|
+
assert_equal(actual_next.progress.npassed, 1)
|
340
|
+
assert_equal(actual_next.progress.nfailed, 0)
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
def pass_two(state)
|
345
|
+
state = enter_text_pump(state, FIRST_CORRECT_ANSWER)
|
346
|
+
assert_instance_of(Challenge::PassedState, state)
|
347
|
+
state = hit_return_pump(state)
|
348
|
+
assert_instance_of(Challenge::QuestionState, state)
|
349
|
+
state = enter_text_pump(state, SECOND_CORRECT_ANSWER)
|
350
|
+
assert_instance_of(Challenge::PassedState, state)
|
351
|
+
hit_return_pump(state)
|
352
|
+
end
|
353
|
+
|
354
|
+
def test_to_breaking
|
355
|
+
with_runtime_on_temp_repo do |runtime|
|
356
|
+
actual = ChallengeCommand.new(runtime).initial_state
|
357
|
+
actual_next = pass_two(actual)
|
358
|
+
assert_instance_of(Challenge::BreakingState, actual_next)
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
def test_to_breaking_to_over
|
363
|
+
with_runtime_on_temp_repo do |runtime|
|
364
|
+
actual = ChallengeCommand.new(runtime).initial_state
|
365
|
+
actual = pass_two(actual)
|
366
|
+
actual = agree_pump(actual, "n")
|
367
|
+
assert_instance_of(Challenge::OverState, actual)
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
def test_to_breaking_to_more
|
372
|
+
with_runtime_on_temp_repo do |runtime|
|
373
|
+
actual = ChallengeCommand.new(runtime).initial_state
|
374
|
+
actual = pass_two(actual)
|
375
|
+
actual = agree_pump(actual, "y")
|
376
|
+
assert_instance_of(Challenge::QuestionState, actual)
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
def test_to_breaking_to_more
|
381
|
+
with_runtime_on_temp_repo do |runtime|
|
382
|
+
actual = ChallengeCommand.new(runtime).initial_state
|
383
|
+
actual = pass_two(actual)
|
384
|
+
actual = agree_pump(actual, "?")
|
385
|
+
assert_instance_of(Challenge::BreakingState, actual)
|
386
|
+
end
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
class StylableTextTest < Test::Unit::TestCase
|
391
|
+
include Ankit
|
392
|
+
include Ankit::TestHelper
|
393
|
+
|
394
|
+
def test_hello
|
395
|
+
assert_equal("Hello, *****!",
|
396
|
+
Card.new(o: "Hello, [World]!").hidden_original)
|
397
|
+
assert_equal("*****, *****!",
|
398
|
+
Card.new(o: "Hello, World!").hidden_original)
|
399
|
+
end
|
400
|
+
|
401
|
+
def test_diff
|
402
|
+
StylableText.new("hello").diff("helo")
|
403
|
+
StylableText.new("helo").diff("hello")
|
404
|
+
StylableText.new("helxo").diff("hello")
|
405
|
+
end
|
406
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
This isn't a card.
|
data/test/data/hope.card
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
O: Hope is the thing with feathers
|
data/test/data/luck.card
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
O: Luck is not chance
|
File without changes
|
File without changes
|
data/test/event_test.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
require 'ankit/event'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class EventTest < Test::Unit::TestCase
|
6
|
+
include Ankit
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@target = Event.parse('{"envelope":{"at":"2001-02-03T04:05:06+00:00","round":1},' +
|
10
|
+
'"values":{"type":"card","verb":"add","name":"hello","maturity":1}}')
|
11
|
+
@next_envelope = Envelope.parse('{"at":"2002-03-04T05:06:07+00:00","round":2}')
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_to_passed
|
15
|
+
expected = Event.new(@next_envelope, JSON.parse('{"type":"card","verb":"passed","name":"hello","maturity":2}'))
|
16
|
+
actual = @target.to_passed(@next_envelope)
|
17
|
+
assert_equal(actual, expected)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_to_failed
|
21
|
+
expected = Event.new(@next_envelope, JSON.parse('{"type":"card","verb":"failed","name":"hello","maturity":0}'))
|
22
|
+
actual = @target.to_failed(@next_envelope)
|
23
|
+
assert_equal(actual, expected)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_next_round
|
27
|
+
assert_equal(@target.next_round, 3)
|
28
|
+
end
|
29
|
+
end
|
data/test/helpers.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
|
2
|
+
require 'ankit/runtime'
|
3
|
+
require 'stringio'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
module Ankit
|
7
|
+
TEST_DATA_BASE = File.join(File.dirname(__FILE__), "data")
|
8
|
+
HELLO_REPO = File.join(TEST_DATA_BASE, "hello_repo")
|
9
|
+
VANILLA_REPO = File.join(TEST_DATA_BASE, "vanilla_repo")
|
10
|
+
NUMBER_REPO = File.join(TEST_DATA_BASE, "number_repo")
|
11
|
+
|
12
|
+
class RuntimeWithMockedIO < Runtime
|
13
|
+
def initialize(config)
|
14
|
+
super
|
15
|
+
supress_io
|
16
|
+
end
|
17
|
+
|
18
|
+
def printed_line; self.stdout.string.strip; end
|
19
|
+
def printed_lines; self.stdout.string.split("\n").map(&:strip); end
|
20
|
+
|
21
|
+
def self.prepare_default; end
|
22
|
+
end
|
23
|
+
|
24
|
+
module TestHelper
|
25
|
+
def test_data_at(*args) File.join(TEST_DATA_BASE, *args); end
|
26
|
+
def repo_data_at(*args) File.join(HELLO_REPO, *args); end
|
27
|
+
|
28
|
+
def copy_hello_repo_to(dst)
|
29
|
+
FileUtils.cp_r(HELLO_REPO, dst)
|
30
|
+
File.join(dst, File.basename(HELLO_REPO))
|
31
|
+
end
|
32
|
+
|
33
|
+
def make_config(repo_dir=HELLO_REPO)
|
34
|
+
config = Config.new
|
35
|
+
config.repo = repo_dir
|
36
|
+
config.location = "anomone"
|
37
|
+
config
|
38
|
+
end
|
39
|
+
|
40
|
+
def make_runtime(repo_dir=HELLO_REPO)
|
41
|
+
RuntimeWithMockedIO.new(make_config(repo_dir))
|
42
|
+
end
|
43
|
+
|
44
|
+
def make_vanilla_runtime()
|
45
|
+
make_runtime(VANILLA_REPO)
|
46
|
+
end
|
47
|
+
|
48
|
+
def with_runtime_on_temp_repo(&block)
|
49
|
+
Dir.mktmpdir do |temp_repo|
|
50
|
+
block.call(make_runtime(copy_hello_repo_to(temp_repo)))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
|
2
|
+
require 'ankit/runtime'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class ProgressTest < Test::Unit::TestCase
|
6
|
+
include Ankit
|
7
|
+
include Ankit::TestHelper
|
8
|
+
include Ankit::CardNaming
|
9
|
+
include Challenge
|
10
|
+
|
11
|
+
def make_target(runtime)
|
12
|
+
Progress.new(Session.new(runtime), [Slot.new("path1"), Slot.new("path2"), Slot.new("path3")])
|
13
|
+
end
|
14
|
+
|
15
|
+
def first_slot_event_of(progress)
|
16
|
+
EventTraversing.find_latest_event_for(progress.runtime, progress.slots[0].path)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_fail
|
20
|
+
with_runtime_on_temp_repo do |runtime|
|
21
|
+
target = make_target(runtime)
|
22
|
+
target.fail
|
23
|
+
fetched_event = first_slot_event_of(target)
|
24
|
+
assert_equal(target.index, 0)
|
25
|
+
assert_equal(target.slots[0].rating, :failed)
|
26
|
+
assert_equal(target.slots[0].event, fetched_event)
|
27
|
+
assert_equal(0, fetched_event.maturity)
|
28
|
+
assert(runtime.printed_line.empty?)
|
29
|
+
assert_equal(1, target.nfailed)
|
30
|
+
assert_equal(0, target.npassed)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_pass
|
35
|
+
with_runtime_on_temp_repo do |runtime|
|
36
|
+
target = make_target(runtime)
|
37
|
+
target.pass
|
38
|
+
fetched_event = first_slot_event_of(target)
|
39
|
+
assert_equal(target.index, 1)
|
40
|
+
assert_equal(target.slots[0].rating, :passed)
|
41
|
+
assert_equal(target.slots[0].event, fetched_event)
|
42
|
+
assert_equal(1, fetched_event.maturity)
|
43
|
+
assert(runtime.printed_line.empty?)
|
44
|
+
|
45
|
+
assert_equal(0, target.nfailed)
|
46
|
+
assert_equal(1, target.npassed)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_fail_then_pass
|
51
|
+
with_runtime_on_temp_repo do |runtime|
|
52
|
+
target = make_target(runtime)
|
53
|
+
target.fail
|
54
|
+
target.pass
|
55
|
+
fetched_event = first_slot_event_of(target)
|
56
|
+
assert_equal(target.index, 1)
|
57
|
+
assert_equal(target.slots[0].rating, :failed)
|
58
|
+
assert_equal(target.slots[0].event, fetched_event)
|
59
|
+
assert_equal(0, fetched_event.maturity)
|
60
|
+
|
61
|
+
assert_equal(1, target.nfailed)
|
62
|
+
assert_equal(0, target.npassed)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_round_during_progress
|
67
|
+
with_runtime_on_temp_repo do |runtime|
|
68
|
+
target = make_target(runtime)
|
69
|
+
target.pass
|
70
|
+
e1 = EventTraversing.find_latest_event_named(runtime, "path1")
|
71
|
+
target.pass
|
72
|
+
e2 = EventTraversing.find_latest_event_named(runtime, "path2")
|
73
|
+
assert_equal(target.this_round, e1.round)
|
74
|
+
assert_equal(target.this_round, e2.round)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_indicator
|
79
|
+
with_runtime_on_temp_repo do |runtime|
|
80
|
+
target = make_target(runtime)
|
81
|
+
assert_equal("---", target.indicator)
|
82
|
+
target.pass
|
83
|
+
assert_equal("o--", target.indicator)
|
84
|
+
target.attack
|
85
|
+
assert_equal("o*-", target.indicator)
|
86
|
+
target.fail
|
87
|
+
assert_equal("ox-", target.indicator)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_round_delta
|
92
|
+
with_runtime_on_temp_repo do |runtime|
|
93
|
+
target = make_target(runtime).pass.pass.pass
|
94
|
+
assert_equal(1, target.round_delta)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|