Last active
August 29, 2015 14:08
-
-
Save dtinth/79cc4e669dd0994192be to your computer and use it in GitHub Desktop.
Food Chain Example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var ANIMALS = { | |
1: { name: 'fly' }, | |
2: { name: 'spider', interjection: "It wriggled and jiggled and tickled inside her.\n", | |
add: " that wriggled and jiggled and tickled inside her" }, | |
3: { name: 'bird', interjection: "How absurd to swallow a bird!\n" }, | |
4: { name: 'cat', interjection: "Imagine that, to swallow a cat!\n" }, | |
5: { name: 'dog', interjection: "What a hog, to swallow a dog!\n" }, | |
6: { name: 'goat', interjection: "Just opened her throat and swallowed a goat!\n" }, | |
7: { name: 'cow', interjection: "I don't know how she swallowed a cow!\n" }, | |
8: { name: 'horse', interjection: "She's dead, of course!\n" }, | |
} | |
// Public functions ----------------------------------------------------------- | |
exports.verse = verse | |
function verse(n) { | |
if (n == 8) { | |
return verseBeginning(n) + verseInterjection(n) | |
} else { | |
return verseBeginning(n) + verseInterjection(n) + verseBody(n) + verseEnding(n) | |
} | |
} | |
exports.verses = verses | |
function verses(from, to) { | |
return mapRange(from, to, verse).join('\n') + '\n' | |
} | |
// Verse generators ----------------------------------------------------------- | |
function verseBeginning(n) { // :: number -> Lines | |
return "I know an old lady who swallowed a " + animalName(n) + ".\n" | |
} | |
function verseInterjection(n) { | |
return animal(n).interjection || '' | |
} | |
function verseBody(n) { | |
if (n == 1) { | |
return "" | |
} else { | |
return swallow(n) + verseBody(n - 1) | |
} | |
} | |
function verseEnding(n) { | |
return "I don't know why she swallowed the fly. Perhaps she'll die.\n" | |
} | |
// Helper functions ----------------------------------------------------------- | |
function animal(n) { | |
return ANIMALS[n] | |
} | |
function swallow(n) { | |
return "She swallowed the " + animalName(n) + | |
" to catch the " + animalDescription(n - 1) + ".\n" | |
} | |
function animalName(n) { // :: number -> String | |
return animal(n).name | |
} | |
function animalDescription(n) { | |
return animalName(n) + (animal(n).add || '') | |
} | |
function mapRange(from, to, f) { | |
var out = [] | |
for (var i = from; i <= to; i ++) out.push(f(i)) | |
return out | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var song = require('./food-chain'); | |
describe('Food Chain', function () { | |
it('fly', function () { | |
var expected = "I know an old lady who swallowed a fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n"; | |
expect(song.verse(1)).toEqual(expected); | |
}); | |
it('spider', function () { | |
var expected = "I know an old lady who swallowed a spider.\nIt wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + "I don't know why she swallowed the fly. Perhaps she'll die.\n"; | |
expect(song.verse(2)).toEqual(expected); | |
}); | |
it('bird', function () { | |
var expected = "I know an old lady who swallowed a bird.\n" + | |
"How absurd to swallow a bird!\n" + | |
"She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. Perhaps she'll die.\n"; | |
expect(song.verse(3)).toEqual(expected); | |
}); | |
it('cat', function () { | |
var expected = "I know an old lady who swallowed a cat.\n" + | |
"Imagine that, to swallow a cat!\n" + | |
"She swallowed the cat to catch the bird.\n" + | |
"She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. " + | |
"Perhaps she'll die.\n"; | |
expect(song.verse(4)).toEqual(expected); | |
}); | |
it('dog', function () { | |
var expected = "I know an old lady who swallowed a dog.\n" + | |
"What a hog, to swallow a dog!\n" + | |
"She swallowed the dog to catch the cat.\n" + | |
"She swallowed the cat to catch the bird.\n" + | |
"She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. " + | |
"Perhaps she'll die.\n"; | |
expect(song.verse(5)).toEqual(expected); | |
}); | |
it('goat', function () { | |
var expected = "I know an old lady who swallowed a goat.\n" + | |
"Just opened her throat and swallowed a goat!\n" + | |
"She swallowed the goat to catch the dog.\n" + | |
"She swallowed the dog to catch the cat.\n" + | |
"She swallowed the cat to catch the bird.\n" + | |
"She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. " + | |
"Perhaps she'll die.\n"; | |
expect(song.verse(6)).toEqual(expected); | |
}); | |
it('cow', function () { | |
var expected = "I know an old lady who swallowed a cow.\n" + | |
"I don't know how she swallowed a cow!\n" + | |
"She swallowed the cow to catch the goat.\n" + | |
"She swallowed the goat to catch the dog.\n" + | |
"She swallowed the dog to catch the cat.\n" + | |
"She swallowed the cat to catch the bird.\n" + | |
"She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. " + | |
"Perhaps she'll die.\n"; | |
expect(song.verse(7)).toEqual(expected); | |
}); | |
it('horse', function () { | |
var expected = "I know an old lady who swallowed a horse.\n" + "She's dead, of course!\n"; | |
expect(song.verse(8)).toEqual(expected); | |
}); | |
it('multiple verses', function () { | |
var expected = ""; | |
expected += "I know an old lady who swallowed a fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\n"; | |
expected += "I know an old lady who swallowed a spider.\nIt wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. Perhaps she'll die.\n\n" | |
expect(song.verses(1, 2)).toEqual(expected); | |
}); | |
it('the whole song', function () { | |
var expected = ""; | |
expected += "I know an old lady who swallowed a fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\n"; | |
expected += "I know an old lady who swallowed a spider.\nIt wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. Perhaps she'll die.\n\n" | |
expected += "I know an old lady who swallowed a bird.\n" + | |
"How absurd to swallow a bird!\n" + | |
"She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. Perhaps she'll die.\n\n"; | |
expected += "I know an old lady who swallowed a cat.\n" + | |
"Imagine that, to swallow a cat!\n" + | |
"She swallowed the cat to catch the bird.\n" + | |
"She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. " + | |
"Perhaps she'll die.\n\n"; | |
expected += "I know an old lady who swallowed a dog.\n" + | |
"What a hog, to swallow a dog!\n" + | |
"She swallowed the dog to catch the cat.\n" + | |
"She swallowed the cat to catch the bird.\n" + | |
"She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. " + | |
"Perhaps she'll die.\n\n"; | |
expected += "I know an old lady who swallowed a goat.\n" + | |
"Just opened her throat and swallowed a goat!\n" + | |
"She swallowed the goat to catch the dog.\n" + | |
"She swallowed the dog to catch the cat.\n" + | |
"She swallowed the cat to catch the bird.\n" + | |
"She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. " + | |
"Perhaps she'll die.\n\n"; | |
expected += "I know an old lady who swallowed a cow.\n" + | |
"I don't know how she swallowed a cow!\n" + | |
"She swallowed the cow to catch the goat.\n" + | |
"She swallowed the goat to catch the dog.\n" + | |
"She swallowed the dog to catch the cat.\n" + | |
"She swallowed the cat to catch the bird.\n" + | |
"She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\n" + | |
"She swallowed the spider to catch the fly.\n" + | |
"I don't know why she swallowed the fly. " + | |
"Perhaps she'll die.\n\n"; | |
expected += "I know an old lady who swallowed a horse.\n" + "She's dead, of course!\n\n"; | |
expect(song.verses(1, 8)).toEqual(expected); | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment