Skip to content

Instantly share code, notes, and snippets.

@follesoe
Created June 26, 2012 20:13
Show Gist options
  • Save follesoe/2998594 to your computer and use it in GitHub Desktop.
Save follesoe/2998594 to your computer and use it in GitHub Desktop.
First spike of Jasmine.Io - a simple implementation of Jasmine BDD for Io.
getFizzBuzz := method(number,
if(number % 3 == 0 and number % 5 == 0 , return "FizzBuzz")
if(number % 3 == 0, return "Fizz")
if(number % 5 == 0, return "Buzz")
number
)
describe("FizzBuzz",
it("Should return Fizz for divisible of three",
equals("Fizz", getFizzBuzz(3))
),
it("Should return Buzz for divisible of five",
equals("Buzz", getFizzBuzz(5))
),
it("Should return FizzBuzz for divisible of three and five",
equals("FizzBuzz", getFizzBuzz(15))
),
it("Should return number if not divisible by three or five",
equals(2, getFizzBuzz(2))
)
)
Spec := Object clone
Spec run := method(
ex := try(doMessage(test))
if(ex == nil,
self message := "",
self message := ex error)
yield
)
Suite := Object clone
Suite run := method(
specs foreach(spec,
spec run
yield
)
)
Jasmine := Object clone
Jasmine suites := List clone
Jasmine clone := Jasmine
describe := method(description,
suite := Suite clone
specs := List clone
suite description := description
suite specs := specs
args := call message arguments
args removeFirst
args foreach(arg,
specDescription := arg arguments at(0) asString asMutable removePrefix("\"") removeSuffix("\"")
spec := Spec clone
spec description := specDescription
spec test := arg arguments at(1)
specs append(spec)
)
Jasmine suites append(suite)
suite
)
equals := method(expected, actual,
if(expected != actual,
Exception raise("Expected " .. expected .. ", but was " .. actual)
)
)
stringEquals := method(expected, actual,
expected foreach(i, char,
if(expected at(i) asCharacter != actual at(i) asCharacter,
Exception raise("Expected " .. expected .. ", but was " .. actual .. ". Strings differ at index " .. i))
)
)
files := Directory with(Directory currentWorkingDirectory) files
filenames := files map(file, file name) select(name, name endsWithSeq("_spec.io"))
filenames foreach(filename, doFile(filename))
Jasmine suites foreach(suite,
suite run
suite description println
suite specs foreach(spec,
if(spec message isEmpty,
writeln(" ✓ " .. spec description .. " : passed"),
writeln(" ϰ " .. spec description .. ": " .. spec message))
)
success := suite specs select(spec, spec message isEmpty) size
failures := suite specs size - success
writeln()
writeln("Results: " .. suite specs size .. " specs, " .. failures .. " failures")
writeln()
)
describe("jasmine.io equals",
it("can check for truth",
equals(true, true)
),
it("can check for lies",
ex := try(equals(true, false))
equals("Expected true, but was false", ex error)
)
)
describe("jasmine.io stringEquals",
it("can check that two strings are the same",
stringEquals("Jasmine.Io", "Jasmine.Io")
),
it("can determine where two strings differ",
ex := try(stringEquals("Jasmine.Io", "Jasmine.Js"))
equals("Expected Jasmine.Io, but was Jasmine.Js. Strings differ at index 8", ex error)
)
)
describe("jasmine.io Spec",
it("Should be possible to run a spec and detect failure",
failingSpec := Spec clone
failingSpec test := method(
Exception raise("Something went wrong...")
)
failingSpec run
equals("Something went wrong...", failingSpec message)
),
it("Should be possible to get description of spec",
suite := describe("A Suite", it("Spec"))
equals("Spec", suite specs at(0) description)
Jasmine suites remove(suite)
)
)
describe("jasmine.io Suite",
it("Should be possible to run a suite and detect failure",
failingSuite := describe("A failing suite",
it("True is false",
equals(true, false)
)
)
failingSuite run
equals("Expected true, but was false", failingSuite specs at(0) message)
Jasmine suites remove(failingSuite)
),
it("Should be possible to get the description of the suite",
suite := describe("My Description")
equals("My Description", suite description)
Jasmine suites remove(suite)
),
it("Should not execute the tests straight away",
suite := doString("describe(\"true\", IT_FAILS)")
Jasmine suites remove(suite)
)
)
$ Io jasmine.io
FizzBuzz
✓ Should return Fizz for divisible of three : passed
✓ Should return Buzz for divisible of five : passed
✓ Should return FizzBuzz for divisible of three and five : passed
✓ Should return number if not divisible by three or five : passed
Results: 4 specs, 0 failures
jasmine.io equals
✓ can check for truth : passed
✓ can check for lies : passed
Results: 2 specs, 0 failures
jasmine.io stringEquals
✓ can check that two strings are the same : passed
✓ can determine where two strings differ : passed
Results: 2 specs, 0 failures
jasmine.io Spec
✓ Should be possible to run a spec and detect failure : passed
✓ Should be possible to get description of spec : passed
Results: 2 specs, 0 failures
jasmine.io Suite
✓ Should be possible to run a suite and detect failure : passed
✓ Should be possible to get the description of the suite : passed
✓ Should not execute the tests straight away : passed
Results: 3 specs, 0 failures
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment