ankit 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|