trackler 2.2.1.33 → 2.2.1.34
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/README.md +1 -1
- data/problem-specifications/exercises/palindrome-products/description.md +9 -3
- data/tracks/c/exercises/hamming/src/example.c +9 -8
- data/tracks/c/exercises/hamming/src/example.h +1 -1
- data/tracks/c/exercises/hamming/test/test_hamming.c +31 -7
- data/tracks/clojure/config.json +10 -0
- data/tracks/clojure/exercises/collatz-conjecture/README.md +34 -0
- data/tracks/clojure/exercises/collatz-conjecture/project.clj +4 -0
- data/tracks/clojure/exercises/collatz-conjecture/src/collatz_conjecture.clj +3 -0
- data/tracks/clojure/exercises/collatz-conjecture/src/example.clj +13 -0
- data/tracks/clojure/exercises/collatz-conjecture/test/collatz_conjecture_test.clj +29 -0
- data/tracks/coldfusion/.gitignore +1 -0
- data/tracks/coldfusion/.travis.yml +16 -4
- data/tracks/coldfusion/CONTRIBUTING.md +10 -0
- data/tracks/coldfusion/README.md +85 -6
- data/tracks/coldfusion/config.json +195 -10
- data/tracks/coldfusion/config/maintainers.json +8 -1
- data/tracks/coldfusion/docs/ABOUT.md +8 -0
- data/tracks/coldfusion/docs/EXERCISE_README_INSERT.md +15 -0
- data/tracks/coldfusion/docs/INSTALLATION.md +35 -0
- data/tracks/coldfusion/docs/LEARNING.md +37 -0
- data/tracks/coldfusion/docs/RESOURCES.md +29 -0
- data/tracks/coldfusion/docs/SNIPPET.txt +8 -0
- data/tracks/coldfusion/docs/TESTS.md +19 -0
- data/tracks/coldfusion/exercises/acronym/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/acronym/Acronym.cfc +13 -0
- data/tracks/coldfusion/exercises/acronym/AcronymTest.cfc +43 -0
- data/tracks/coldfusion/exercises/acronym/Solution.cfc +22 -0
- data/tracks/coldfusion/exercises/acronym/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/acronym/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/acronym/box.json +8 -0
- data/tracks/coldfusion/exercises/acronym/index.cfm +37 -0
- data/tracks/coldfusion/exercises/atbash-cipher/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/atbash-cipher/AtbashCipher.cfc +14 -0
- data/tracks/coldfusion/exercises/atbash-cipher/AtbashCipherTest.cfc +71 -0
- data/tracks/coldfusion/exercises/atbash-cipher/Solution.cfc +56 -0
- data/tracks/coldfusion/exercises/atbash-cipher/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/atbash-cipher/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/atbash-cipher/box.json +8 -0
- data/tracks/coldfusion/exercises/atbash-cipher/index.cfm +37 -0
- data/tracks/coldfusion/exercises/diamond/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/diamond/Diamond.cfc +13 -0
- data/tracks/coldfusion/exercises/diamond/DiamondTest.cfc +35 -0
- data/tracks/coldfusion/exercises/diamond/Solution.cfc +35 -0
- data/tracks/coldfusion/exercises/diamond/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/diamond/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/diamond/box.json +8 -0
- data/tracks/coldfusion/exercises/diamond/index.cfm +37 -0
- data/tracks/coldfusion/exercises/difference-of-squares/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/difference-of-squares/DifferenceOfSquares.cfc +18 -0
- data/tracks/coldfusion/exercises/difference-of-squares/DifferenceOfSquaresTest.cfc +63 -0
- data/tracks/coldfusion/exercises/difference-of-squares/Solution.cfc +28 -0
- data/tracks/coldfusion/exercises/difference-of-squares/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/difference-of-squares/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/difference-of-squares/box.json +8 -0
- data/tracks/coldfusion/exercises/difference-of-squares/index.cfm +37 -0
- data/tracks/coldfusion/exercises/flatten-array/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/flatten-array/FlattenArray.cfc +13 -0
- data/tracks/coldfusion/exercises/flatten-array/FlattenArrayTest.cfc +42 -0
- data/tracks/coldfusion/exercises/flatten-array/Solution.cfc +26 -0
- data/tracks/coldfusion/exercises/flatten-array/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/flatten-array/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/flatten-array/box.json +8 -0
- data/tracks/coldfusion/exercises/flatten-array/index.cfm +37 -0
- data/tracks/coldfusion/exercises/gigasecond/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/gigasecond/Gigasecond.cfc +13 -0
- data/tracks/coldfusion/exercises/gigasecond/GigasecondTest.cfc +39 -0
- data/tracks/coldfusion/exercises/gigasecond/Solution.cfc +16 -0
- data/tracks/coldfusion/exercises/gigasecond/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/gigasecond/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/gigasecond/box.json +8 -0
- data/tracks/coldfusion/exercises/gigasecond/index.cfm +37 -0
- data/tracks/coldfusion/exercises/grains/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/grains/Grains.cfc +14 -0
- data/tracks/coldfusion/exercises/grains/GrainsTest.cfc +63 -0
- data/tracks/coldfusion/exercises/grains/Solution.cfc +22 -0
- data/tracks/coldfusion/exercises/grains/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/grains/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/grains/box.json +8 -0
- data/tracks/coldfusion/exercises/grains/index.cfm +37 -0
- data/tracks/coldfusion/exercises/hamming/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/hamming/Hamming.cfc +13 -0
- data/tracks/coldfusion/exercises/hamming/HammingTest.cfc +75 -0
- data/tracks/coldfusion/exercises/hamming/Solution.cfc +25 -0
- data/tracks/coldfusion/exercises/hamming/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/hamming/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/hamming/box.json +8 -0
- data/tracks/coldfusion/exercises/hamming/index.cfm +37 -0
- data/tracks/coldfusion/exercises/hello-world/HelloWorld.cfc +13 -0
- data/tracks/coldfusion/exercises/hello-world/HelloWorldTest.cfc +18 -0
- data/tracks/coldfusion/exercises/hello-world/Solution.cfc +13 -0
- data/tracks/coldfusion/exercises/hello-world/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/hello-world/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/hello-world/box.json +8 -0
- data/tracks/coldfusion/exercises/hello-world/index.cfm +37 -0
- data/tracks/coldfusion/exercises/isogram/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/isogram/Isogram.cfc +13 -0
- data/tracks/coldfusion/exercises/isogram/IsogramTest.cfc +55 -0
- data/tracks/coldfusion/exercises/isogram/Solution.cfc +23 -0
- data/tracks/coldfusion/exercises/isogram/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/isogram/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/isogram/box.json +8 -0
- data/tracks/coldfusion/exercises/isogram/index.cfm +37 -0
- data/tracks/coldfusion/exercises/largest-series-product/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/largest-series-product/LargestSeriesProduct.cfc +13 -0
- data/tracks/coldfusion/exercises/largest-series-product/LargestSeriesProductTest.cfc +75 -0
- data/tracks/coldfusion/exercises/largest-series-product/Solution.cfc +41 -0
- data/tracks/coldfusion/exercises/largest-series-product/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/largest-series-product/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/largest-series-product/box.json +8 -0
- data/tracks/coldfusion/exercises/largest-series-product/index.cfm +37 -0
- data/tracks/coldfusion/exercises/leap/Leap.cfc +15 -0
- data/tracks/coldfusion/exercises/leap/LeapTest.cfc +39 -0
- data/tracks/coldfusion/exercises/leap/Solution.cfc +19 -0
- data/tracks/coldfusion/exercises/leap/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/leap/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/leap/box.json +8 -0
- data/tracks/coldfusion/exercises/leap/index.cfm +37 -0
- data/tracks/coldfusion/exercises/luhn/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/luhn/Luhn.cfc +13 -0
- data/tracks/coldfusion/exercises/luhn/LuhnTest.cfc +67 -0
- data/tracks/coldfusion/exercises/luhn/Solution.cfc +38 -0
- data/tracks/coldfusion/exercises/luhn/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/luhn/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/luhn/box.json +8 -0
- data/tracks/coldfusion/exercises/luhn/index.cfm +37 -0
- data/tracks/coldfusion/exercises/nth-prime/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/nth-prime/NthPrime.cfc +13 -0
- data/tracks/coldfusion/exercises/nth-prime/NthPrimeTest.cfc +35 -0
- data/tracks/coldfusion/exercises/nth-prime/Solution.cfc +33 -0
- data/tracks/coldfusion/exercises/nth-prime/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/nth-prime/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/nth-prime/box.json +8 -0
- data/tracks/coldfusion/exercises/nth-prime/index.cfm +37 -0
- data/tracks/coldfusion/exercises/pangram/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/pangram/Pangram.cfc +13 -0
- data/tracks/coldfusion/exercises/pangram/PangramTest.cfc +55 -0
- data/tracks/coldfusion/exercises/pangram/Solution.cfc +21 -0
- data/tracks/coldfusion/exercises/pangram/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/pangram/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/pangram/box.json +8 -0
- data/tracks/coldfusion/exercises/pangram/index.cfm +37 -0
- data/tracks/coldfusion/exercises/pig-latin/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/pig-latin/PigLatin.cfc +13 -0
- data/tracks/coldfusion/exercises/pig-latin/PigLatinTest.cfc +115 -0
- data/tracks/coldfusion/exercises/pig-latin/Solution.cfc +30 -0
- data/tracks/coldfusion/exercises/pig-latin/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/pig-latin/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/pig-latin/box.json +8 -0
- data/tracks/coldfusion/exercises/pig-latin/index.cfm +37 -0
- data/tracks/coldfusion/exercises/raindrops/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/raindrops/Raindrops.cfc +13 -0
- data/tracks/coldfusion/exercises/raindrops/RaindropsTest.cfc +87 -0
- data/tracks/coldfusion/exercises/raindrops/Solution.cfc +33 -0
- data/tracks/coldfusion/exercises/raindrops/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/raindrops/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/raindrops/box.json +8 -0
- data/tracks/coldfusion/exercises/raindrops/index.cfm +37 -0
- data/tracks/coldfusion/exercises/rna-transcription/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/rna-transcription/RnaTranscription.cfc +13 -0
- data/tracks/coldfusion/exercises/rna-transcription/RnaTranscriptionTest.cfc +47 -0
- data/tracks/coldfusion/exercises/rna-transcription/Solution.cfc +35 -0
- data/tracks/coldfusion/exercises/rna-transcription/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/rna-transcription/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/rna-transcription/box.json +8 -0
- data/tracks/coldfusion/exercises/rna-transcription/index.cfm +37 -0
- data/tracks/coldfusion/exercises/saddle-points/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/saddle-points/SaddlePoints.cfc +13 -0
- data/tracks/coldfusion/exercises/saddle-points/SaddlePointsTest.cfc +35 -0
- data/tracks/coldfusion/exercises/saddle-points/Solution.cfc +59 -0
- data/tracks/coldfusion/exercises/saddle-points/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/saddle-points/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/saddle-points/box.json +8 -0
- data/tracks/coldfusion/exercises/saddle-points/index.cfm +37 -0
- data/tracks/coldfusion/exercises/scrabble-score/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/scrabble-score/ScrabbleScore.cfc +13 -0
- data/tracks/coldfusion/exercises/scrabble-score/ScrabbleScoreTest.cfc +59 -0
- data/tracks/coldfusion/exercises/scrabble-score/Solution.cfc +50 -0
- data/tracks/coldfusion/exercises/scrabble-score/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/scrabble-score/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/scrabble-score/box.json +8 -0
- data/tracks/coldfusion/exercises/scrabble-score/index.cfm +37 -0
- data/tracks/coldfusion/exercises/secret-handshake/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/secret-handshake/SecretHandshake.cfc +13 -0
- data/tracks/coldfusion/exercises/secret-handshake/SecretHandshakeTest.cfc +63 -0
- data/tracks/coldfusion/exercises/secret-handshake/Solution.cfc +31 -0
- data/tracks/coldfusion/exercises/secret-handshake/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/secret-handshake/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/secret-handshake/box.json +8 -0
- data/tracks/coldfusion/exercises/secret-handshake/index.cfm +37 -0
- data/tracks/coldfusion/exercises/space-age/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/space-age/Solution.cfc +28 -0
- data/tracks/coldfusion/exercises/space-age/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/space-age/SpaceAge.cfc +13 -0
- data/tracks/coldfusion/exercises/space-age/SpaceAgeTest.cfc +47 -0
- data/tracks/coldfusion/exercises/space-age/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/space-age/box.json +8 -0
- data/tracks/coldfusion/exercises/space-age/index.cfm +37 -0
- data/tracks/coldfusion/exercises/sum-of-multiples/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/sum-of-multiples/Solution.cfc +27 -0
- data/tracks/coldfusion/exercises/sum-of-multiples/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/sum-of-multiples/SumOfMultiples.cfc +13 -0
- data/tracks/coldfusion/exercises/sum-of-multiples/SumOfMultiplesTest.cfc +63 -0
- data/tracks/coldfusion/exercises/sum-of-multiples/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/sum-of-multiples/box.json +8 -0
- data/tracks/coldfusion/exercises/sum-of-multiples/index.cfm +37 -0
- data/tracks/coldfusion/exercises/triangle/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/triangle/Solution.cfc +53 -0
- data/tracks/coldfusion/exercises/triangle/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/exercises/triangle/TestRunner.cfc +103 -0
- data/tracks/coldfusion/exercises/triangle/Triangle.cfc +18 -0
- data/tracks/coldfusion/exercises/triangle/TriangleTest.cfc +95 -0
- data/tracks/coldfusion/exercises/triangle/box.json +8 -0
- data/tracks/coldfusion/exercises/triangle/index.cfm +37 -0
- data/tracks/coldfusion/tasks/GenerateTests.cfc +179 -0
- data/tracks/coldfusion/tasks/ScaffoldExercise.cfc +85 -0
- data/tracks/coldfusion/tasks/TestAllSolutions.cfc +24 -0
- data/tracks/coldfusion/tasks/exercise_template/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/tasks/exercise_template/@@name@@.cfc +13 -0
- data/tracks/coldfusion/tasks/exercise_template/@@name@@Test.cfc +15 -0
- data/tracks/coldfusion/tasks/exercise_template/Solution.cfc +6 -0
- data/tracks/coldfusion/tasks/exercise_template/SolutionTest.cfc +7 -0
- data/tracks/coldfusion/tasks/exercise_template/TestRunner.cfc +103 -0
- data/tracks/coldfusion/tasks/exercise_template/box.json +8 -0
- data/tracks/coldfusion/tasks/exercise_template/index.cfm +37 -0
- data/tracks/common-lisp/config.json +12 -0
- data/tracks/common-lisp/exercises/collatz-conjecture/README.md +84 -0
- data/tracks/common-lisp/exercises/collatz-conjecture/collatz-conjecture-test.lisp +31 -0
- data/tracks/common-lisp/exercises/collatz-conjecture/collatz-conjecture.lisp +7 -0
- data/tracks/common-lisp/exercises/collatz-conjecture/example.lisp +14 -0
- data/tracks/csharp/exercises/clock/Clock.cs +20 -4
- data/tracks/csharp/exercises/clock/ClockTest.cs +290 -55
- data/tracks/csharp/exercises/clock/Example.cs +11 -8
- data/tracks/csharp/generators/Exercises/Clock.cs +75 -0
- data/tracks/csharp/generators/Output/FormattingExtensions.cs +0 -1
- data/tracks/csharp/generators/Program.cs +2 -1
- data/tracks/haskell/config.json +10 -0
- data/tracks/haskell/exercises/collatz-conjecture/README.md +87 -0
- data/tracks/haskell/exercises/collatz-conjecture/examples/success-standard/package.yaml +16 -0
- data/tracks/haskell/exercises/collatz-conjecture/examples/success-standard/src/CollatzConjecture.hs +9 -0
- data/tracks/haskell/exercises/collatz-conjecture/package.yaml +20 -0
- data/tracks/haskell/exercises/collatz-conjecture/src/CollatzConjecture.hs +4 -0
- data/tracks/haskell/exercises/collatz-conjecture/stack.yaml +1 -0
- data/tracks/haskell/exercises/collatz-conjecture/test/Tests.hs +52 -0
- data/tracks/idris/docs/SNIPPET.txt +10 -0
- data/tracks/rust/README.md +83 -2
- data/tracks/rust/config.json +24 -0
- data/tracks/rust/exercises/perfect-numbers/.gitignore +7 -0
- data/tracks/rust/exercises/perfect-numbers/Cargo.toml +5 -0
- data/tracks/rust/exercises/perfect-numbers/README.md +56 -0
- data/tracks/rust/exercises/perfect-numbers/example.rs +20 -0
- data/tracks/rust/exercises/perfect-numbers/src/lib.rs +0 -0
- data/tracks/rust/exercises/perfect-numbers/tests/perfect-numbers.rs +33 -0
- data/tracks/rust/exercises/poker/.gitignore +7 -0
- data/tracks/rust/exercises/poker/.meta/hints.md +8 -0
- data/tracks/rust/exercises/poker/Cargo-example.toml +8 -0
- data/tracks/rust/exercises/poker/Cargo.toml +6 -0
- data/tracks/rust/exercises/poker/README.md +54 -0
- data/tracks/rust/exercises/poker/example.rs +341 -0
- data/tracks/rust/exercises/poker/src/lib.rs +7 -0
- data/tracks/rust/exercises/poker/tests/poker.rs +298 -0
- metadata +242 -5
- data/tracks/coldfusion/exercises/leap/example.cfc +0 -11
- data/tracks/coldfusion/exercises/leap/leap.cfc +0 -5
- data/tracks/coldfusion/exercises/leap/leap_tests.cfc +0 -35
@@ -0,0 +1,103 @@
|
|
1
|
+
/**
|
2
|
+
* I am a CommandBox task runner which you can use to test your implementation of this exercise against the
|
3
|
+
* provided test suite. To use me, open the CommandBox CLI and run this:
|
4
|
+
*
|
5
|
+
* CommandBox> task run TestRunner
|
6
|
+
*
|
7
|
+
* To start up a test watcher that will automatically rerun the test suite every time you save a file change, run this:
|
8
|
+
*
|
9
|
+
* CommandBox> task run TestRunner --watcher
|
10
|
+
*
|
11
|
+
*/
|
12
|
+
component {
|
13
|
+
|
14
|
+
/**
|
15
|
+
* @solution Runs the tests against the solution
|
16
|
+
* @watcher Start up a file watch that re-runs the tests on file changes. Use Ctrl-C to stop
|
17
|
+
*/
|
18
|
+
function run( boolean solution=false, boolean watcher=false ) {
|
19
|
+
|
20
|
+
ensureTestBox();
|
21
|
+
|
22
|
+
if( watcher ) {
|
23
|
+
|
24
|
+
// Tabula rasa
|
25
|
+
command( 'cls' ).run();
|
26
|
+
|
27
|
+
// Start watcher
|
28
|
+
watch()
|
29
|
+
.paths( '*.cfc' )
|
30
|
+
.inDirectory( getCWD() )
|
31
|
+
.withDelay( 500 )
|
32
|
+
.onChange( function() {
|
33
|
+
|
34
|
+
// Clear the screen
|
35
|
+
command( 'cls' )
|
36
|
+
.run();
|
37
|
+
|
38
|
+
// This is neccessary so changes to tests get picked up right away.
|
39
|
+
pagePoolClear();
|
40
|
+
|
41
|
+
runTests( solution );
|
42
|
+
|
43
|
+
} )
|
44
|
+
.start();
|
45
|
+
|
46
|
+
} else {
|
47
|
+
runTests( solution );
|
48
|
+
}
|
49
|
+
|
50
|
+
}
|
51
|
+
|
52
|
+
/**
|
53
|
+
* Make sure the TestBox framework is installed
|
54
|
+
*/
|
55
|
+
private function ensureTestBox() {
|
56
|
+
var excerciseRoot = getCWD();
|
57
|
+
var testBoxRoot = excerciseRoot & '/testbox';
|
58
|
+
|
59
|
+
if( !directoryExists( testBoxRoot ) ) {
|
60
|
+
|
61
|
+
print.boldYellowLine( 'Installing some missing dependencies for you!' ).toConsole();
|
62
|
+
command( 'install' )
|
63
|
+
.inWorkingDirectory( excerciseRoot )
|
64
|
+
.run();
|
65
|
+
}
|
66
|
+
|
67
|
+
// Bootstrap TestBox framework
|
68
|
+
filesystemUtil.createMapping( '/testbox', testBoxRoot );
|
69
|
+
}
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Invoke TestBox to run the test suite
|
73
|
+
*/
|
74
|
+
private function runTests( boolean solution=false ) {
|
75
|
+
|
76
|
+
// Create TestBox and run the tests
|
77
|
+
testData = new testbox.system.TestBox()
|
78
|
+
.runRaw( directory = {
|
79
|
+
// Find all CFCs...
|
80
|
+
mapping = filesystemUtil.makePathRelative( getCWD() ),
|
81
|
+
// ... in this directory ...
|
82
|
+
recurse = false,
|
83
|
+
// ... whose name ends in "test"
|
84
|
+
filter = function( path ) {
|
85
|
+
return path.reFind( ( solution ? 'Solution' : '' ) & 'Test.cfc$' );
|
86
|
+
}
|
87
|
+
} )
|
88
|
+
.getMemento();
|
89
|
+
|
90
|
+
// Print out the results with ANSI formatting for the CLI
|
91
|
+
getInstance( 'CLIRenderer@testbox-commands' )
|
92
|
+
.render( print, testData, true );
|
93
|
+
|
94
|
+
print.toConsole();
|
95
|
+
|
96
|
+
// Set proper exit code
|
97
|
+
if( testData.totalFail || testData.totalError ) {
|
98
|
+
setExitCode( 1 );
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
}
|
103
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<!---
|
2
|
+
|
3
|
+
This file will only be used if you want to start up a web server in this directory. You can do so by running:
|
4
|
+
|
5
|
+
$> box
|
6
|
+
CommandBox> install
|
7
|
+
CommandBox> server start
|
8
|
+
|
9
|
+
However, this is not necessary unless you really just want to use the HTML reporters on TestBox.
|
10
|
+
Ideally, you'll skip the need for this file entirely and just run the tests directly frm the CLI like this:
|
11
|
+
|
12
|
+
CommandBox> task run TestRunner
|
13
|
+
|
14
|
+
--->
|
15
|
+
<cfsetting showDebugOutput="false">
|
16
|
+
<cfparam name="url.reporter" default="simple">
|
17
|
+
<cfscript>
|
18
|
+
// get a list of all CFCs in this folder whose name looks like "XXXTest.cfc"
|
19
|
+
// And turn it into compnent path relative to the web root
|
20
|
+
url.bundles = directoryList(
|
21
|
+
path=expandPath( '/' ),
|
22
|
+
filter='*Test.cfc' )
|
23
|
+
.map( function( path ) {
|
24
|
+
return path
|
25
|
+
.replaceNoCase( expandPath( '/' ), '' )
|
26
|
+
.left( -4 )
|
27
|
+
} )
|
28
|
+
.toList();
|
29
|
+
</cfscript>
|
30
|
+
|
31
|
+
<!--- Ensure TestBox --->
|
32
|
+
<cfif fileExists( "/testbox/system/runners/HTMLRunner.cfm" )>
|
33
|
+
<!--- Include the TestBox HTML Runner --->
|
34
|
+
<cfinclude template="/testbox/system/runners/HTMLRunner.cfm">
|
35
|
+
<cfelse>
|
36
|
+
Oops, you don't have TestBox installed yet! Please run <b>box install</b> from the root of your excercise folder and refresh this page.
|
37
|
+
</cfif>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/**
|
2
|
+
* Your implmentation of the Leap exercise
|
3
|
+
*/
|
4
|
+
component {
|
5
|
+
|
6
|
+
/**
|
7
|
+
* @year The input year to consider
|
8
|
+
*
|
9
|
+
* @returns A boolean for whether the inputted year is true or false
|
10
|
+
*/
|
11
|
+
function isLeapYear( year ) {
|
12
|
+
// Implement me here
|
13
|
+
}
|
14
|
+
|
15
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
component extends="testbox.system.BaseSpec" {
|
2
|
+
|
3
|
+
function beforeAll(){
|
4
|
+
SUT = createObject( 'Leap' );
|
5
|
+
}
|
6
|
+
|
7
|
+
function run(){
|
8
|
+
|
9
|
+
describe( "My Leap year calculator", function(){
|
10
|
+
|
11
|
+
it( "should detect a leap year", function(){
|
12
|
+
expect( SUT.isLeapYear( 1996 ) ).toBeTrue();
|
13
|
+
});
|
14
|
+
|
15
|
+
it( "should detect a non-leap year", function(){
|
16
|
+
expect( SUT.isLeapYear( 1997 ) ).toBeFalse();
|
17
|
+
});
|
18
|
+
|
19
|
+
it( "should detect a non-leap even year", function(){
|
20
|
+
expect( SUT.isLeapYear( 1998 ) ).toBeFalse();
|
21
|
+
});
|
22
|
+
|
23
|
+
it( "should detect a century", function(){
|
24
|
+
expect( SUT.isLeapYear( 1900 ) ).toBeFalse();
|
25
|
+
});
|
26
|
+
|
27
|
+
it( "should detect a fourth century", function(){
|
28
|
+
expect( SUT.isLeapYear( 2400 ) ).toBeTrue();
|
29
|
+
});
|
30
|
+
|
31
|
+
it( "should detect Y2K", function(){
|
32
|
+
expect( SUT.isLeapYear( 2000 ) ).toBeTrue();
|
33
|
+
});
|
34
|
+
|
35
|
+
});
|
36
|
+
|
37
|
+
}
|
38
|
+
|
39
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
/**
|
2
|
+
* Here is an example solution for the Leap exercise
|
3
|
+
*/
|
4
|
+
component {
|
5
|
+
|
6
|
+
/**
|
7
|
+
* @year The input year to consider
|
8
|
+
*
|
9
|
+
* @returns A boolean for whether the inputted year is true or false
|
10
|
+
*/
|
11
|
+
function isLeapYear( year ) {
|
12
|
+
if( year % 400 == 0 ) {
|
13
|
+
return true;
|
14
|
+
} else if( year % 4 == 0 && year % 100 != 0 ) {
|
15
|
+
return true;
|
16
|
+
}
|
17
|
+
return false;
|
18
|
+
}
|
19
|
+
}
|
@@ -0,0 +1,103 @@
|
|
1
|
+
/**
|
2
|
+
* I am a CommandBox task runner which you can use to test your implementation of this exercise against the
|
3
|
+
* provided test suite. To use me, open the CommandBox CLI and run this:
|
4
|
+
*
|
5
|
+
* CommandBox> task run TestRunner
|
6
|
+
*
|
7
|
+
* To start up a test watcher that will automatically rerun the test suite every time you save a file change, run this:
|
8
|
+
*
|
9
|
+
* CommandBox> task run TestRunner --watcher
|
10
|
+
*
|
11
|
+
*/
|
12
|
+
component {
|
13
|
+
|
14
|
+
/**
|
15
|
+
* @solution Runs the tests against the solution
|
16
|
+
* @watcher Start up a file watch that re-runs the tests on file changes. Use Ctrl-C to stop
|
17
|
+
*/
|
18
|
+
function run( boolean solution=false, boolean watcher=false ) {
|
19
|
+
|
20
|
+
ensureTestBox();
|
21
|
+
|
22
|
+
if( watcher ) {
|
23
|
+
|
24
|
+
// Tabula rasa
|
25
|
+
command( 'cls' ).run();
|
26
|
+
|
27
|
+
// Start watcher
|
28
|
+
watch()
|
29
|
+
.paths( '*.cfc' )
|
30
|
+
.inDirectory( getCWD() )
|
31
|
+
.withDelay( 500 )
|
32
|
+
.onChange( function() {
|
33
|
+
|
34
|
+
// Clear the screen
|
35
|
+
command( 'cls' )
|
36
|
+
.run();
|
37
|
+
|
38
|
+
// This is neccessary so changes to tests get picked up right away.
|
39
|
+
pagePoolClear();
|
40
|
+
|
41
|
+
runTests( solution );
|
42
|
+
|
43
|
+
} )
|
44
|
+
.start();
|
45
|
+
|
46
|
+
} else {
|
47
|
+
runTests( solution );
|
48
|
+
}
|
49
|
+
|
50
|
+
}
|
51
|
+
|
52
|
+
/**
|
53
|
+
* Make sure the TestBox framework is installed
|
54
|
+
*/
|
55
|
+
private function ensureTestBox() {
|
56
|
+
var excerciseRoot = getCWD();
|
57
|
+
var testBoxRoot = excerciseRoot & '/testbox';
|
58
|
+
|
59
|
+
if( !directoryExists( testBoxRoot ) ) {
|
60
|
+
|
61
|
+
print.boldYellowLine( 'Installing some missing dependencies for you!' ).toConsole();
|
62
|
+
command( 'install' )
|
63
|
+
.inWorkingDirectory( excerciseRoot )
|
64
|
+
.run();
|
65
|
+
}
|
66
|
+
|
67
|
+
// Bootstrap TestBox framework
|
68
|
+
filesystemUtil.createMapping( '/testbox', testBoxRoot );
|
69
|
+
}
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Invoke TestBox to run the test suite
|
73
|
+
*/
|
74
|
+
private function runTests( boolean solution=false ) {
|
75
|
+
|
76
|
+
// Create TestBox and run the tests
|
77
|
+
testData = new testbox.system.TestBox()
|
78
|
+
.runRaw( directory = {
|
79
|
+
// Find all CFCs...
|
80
|
+
mapping = filesystemUtil.makePathRelative( getCWD() ),
|
81
|
+
// ... in this directory ...
|
82
|
+
recurse = false,
|
83
|
+
// ... whose name ends in "test"
|
84
|
+
filter = function( path ) {
|
85
|
+
return path.reFind( ( solution ? 'Solution' : '' ) & 'Test.cfc$' );
|
86
|
+
}
|
87
|
+
} )
|
88
|
+
.getMemento();
|
89
|
+
|
90
|
+
// Print out the results with ANSI formatting for the CLI
|
91
|
+
getInstance( 'CLIRenderer@testbox-commands' )
|
92
|
+
.render( print, testData, true );
|
93
|
+
|
94
|
+
print.toConsole();
|
95
|
+
|
96
|
+
// Set proper exit code
|
97
|
+
if( testData.totalFail || testData.totalError ) {
|
98
|
+
setExitCode( 1 );
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
}
|
103
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<!---
|
2
|
+
|
3
|
+
This file will only be used if you want to start up a web server in this directory. You can do so by running:
|
4
|
+
|
5
|
+
$> box
|
6
|
+
CommandBox> install
|
7
|
+
CommandBox> server start
|
8
|
+
|
9
|
+
However, this is not necessary unless you really just want to use the HTML reporters on TestBox.
|
10
|
+
Ideally, you'll skip the need for this file entirely and just run the tests directly frm the CLI like this:
|
11
|
+
|
12
|
+
CommandBox> task run TestRunner
|
13
|
+
|
14
|
+
--->
|
15
|
+
<cfsetting showDebugOutput="false">
|
16
|
+
<cfparam name="url.reporter" default="simple">
|
17
|
+
<cfscript>
|
18
|
+
// get a list of all CFCs in this folder whose name looks like "XXXTest.cfc"
|
19
|
+
// And turn it into compnent path relative to the web root
|
20
|
+
url.bundles = directoryList(
|
21
|
+
path=expandPath( '/' ),
|
22
|
+
filter='*Test.cfc' )
|
23
|
+
.map( function( path ) {
|
24
|
+
return path
|
25
|
+
.replaceNoCase( expandPath( '/' ), '' )
|
26
|
+
.left( -4 )
|
27
|
+
} )
|
28
|
+
.toList();
|
29
|
+
</cfscript>
|
30
|
+
|
31
|
+
<!--- Ensure TestBox --->
|
32
|
+
<cfif fileExists( "/testbox/system/runners/HTMLRunner.cfm" )>
|
33
|
+
<!--- Include the TestBox HTML Runner --->
|
34
|
+
<cfinclude template="/testbox/system/runners/HTMLRunner.cfm">
|
35
|
+
<cfelse>
|
36
|
+
Oops, you don't have TestBox installed yet! Please run <b>box install</b> from the root of your excercise folder and refresh this page.
|
37
|
+
</cfif>
|
File without changes
|
@@ -0,0 +1,67 @@
|
|
1
|
+
component extends="testbox.system.BaseSpec" {
|
2
|
+
|
3
|
+
function beforeAll(){
|
4
|
+
SUT = createObject( 'Luhn' );
|
5
|
+
}
|
6
|
+
|
7
|
+
function run(){
|
8
|
+
|
9
|
+
describe( "My Luhn class", function(){
|
10
|
+
|
11
|
+
it( 'single digit strings can not be valid', function(){
|
12
|
+
expect( SUT.valid( input='1' ) ).toBeFalse();
|
13
|
+
});
|
14
|
+
|
15
|
+
it( 'A single zero is invalid', function(){
|
16
|
+
expect( SUT.valid( input='0' ) ).toBeFalse();
|
17
|
+
});
|
18
|
+
|
19
|
+
it( 'a simple valid SIN that remains valid if reversed', function(){
|
20
|
+
expect( SUT.valid( input='059' ) ).toBeTrue();
|
21
|
+
});
|
22
|
+
|
23
|
+
it( 'a simple valid SIN that becomes invalid if reversed', function(){
|
24
|
+
expect( SUT.valid( input='59' ) ).toBeTrue();
|
25
|
+
});
|
26
|
+
|
27
|
+
it( 'a valid Canadian SIN', function(){
|
28
|
+
expect( SUT.valid( input='055 444 285' ) ).toBeTrue();
|
29
|
+
});
|
30
|
+
|
31
|
+
it( 'invalid Canadian SIN', function(){
|
32
|
+
expect( SUT.valid( input='055 444 286' ) ).toBeFalse();
|
33
|
+
});
|
34
|
+
|
35
|
+
it( 'invalid credit card', function(){
|
36
|
+
expect( SUT.valid( input='8273 1232 7352 0569' ) ).toBeFalse();
|
37
|
+
});
|
38
|
+
|
39
|
+
it( 'valid strings with a non-digit included become invalid', function(){
|
40
|
+
expect( SUT.valid( input='055a 444 285' ) ).toBeFalse();
|
41
|
+
});
|
42
|
+
|
43
|
+
it( 'valid strings with punctuation included become invalid', function(){
|
44
|
+
expect( SUT.valid( input='055-444-285' ) ).toBeFalse();
|
45
|
+
});
|
46
|
+
|
47
|
+
it( 'valid strings with symbols included become invalid', function(){
|
48
|
+
expect( SUT.valid( input='055£ 444$ 285' ) ).toBeFalse();
|
49
|
+
});
|
50
|
+
|
51
|
+
it( 'single zero with space is invalid', function(){
|
52
|
+
expect( SUT.valid( input=' 0' ) ).toBeFalse();
|
53
|
+
});
|
54
|
+
|
55
|
+
it( 'more than a single zero is valid', function(){
|
56
|
+
expect( SUT.valid( input='0000 0' ) ).toBeTrue();
|
57
|
+
});
|
58
|
+
|
59
|
+
it( 'input digit 9 is correctly converted to output digit 9', function(){
|
60
|
+
expect( SUT.valid( input='091' ) ).toBeTrue();
|
61
|
+
});
|
62
|
+
|
63
|
+
});
|
64
|
+
|
65
|
+
}
|
66
|
+
|
67
|
+
}
|