Skip to content

Instantly share code, notes, and snippets.

@dtinth
Last active August 29, 2015 14:08
Show Gist options
  • Save dtinth/79cc4e669dd0994192be to your computer and use it in GitHub Desktop.
Save dtinth/79cc4e669dd0994192be to your computer and use it in GitHub Desktop.
Food Chain Example
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
}
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