From 86c4374f2ee7635b1132de30896007ce86af2c0d Mon Sep 17 00:00:00 2001 From: Wil Moore III Date: Wed, 16 Apr 2014 23:57:42 -0600 Subject: [PATCH 1/3] refactor anagram example's API dropping constructor pattern (no new) and changing match to matches -- better responsibility separation also --- anagram/anagram_test.spec.js | 64 +++++++++++++++++++++--------------- anagram/example.js | 50 +++++++++++++--------------- 2 files changed, 60 insertions(+), 54 deletions(-) diff --git a/anagram/anagram_test.spec.js b/anagram/anagram_test.spec.js index 96925811..e2a6e688 100644 --- a/anagram/anagram_test.spec.js +++ b/anagram/anagram_test.spec.js @@ -1,58 +1,68 @@ -var Anagram = require('./anagram'); +var anagram = require('./anagram'); describe('Anagram', function() { it("no matches",function() { - var detector = new Anagram("diaper"); - var matches = detector.match([ "hello", "world", "zombies", "pants"]); + var subject = anagram("diaper"); + var matches = subject.matches([ "hello", "world", "zombies", "pants"]); + expect(matches).toEqual([]); }); - xit("detects simple anagram",function() { - var detector = new Anagram("ant"); - var matches = detector.match(['tan', 'stand', 'at']); + it("detects simple anagram",function() { + var subject = anagram("ant"); + var matches = subject.matches(['tan', 'stand', 'at']); + expect(matches).toEqual(['tan']); }); - xit("does not detect false positives",function() { - var detector = new Anagram("galea"); - var matches = detector.match(["eagle"]); + it("does not detect false positives",function() { + var subject = anagram("galea"); + var matches = subject.matches(["eagle"]); + expect(matches).toEqual([]); }); - xit("detects multiple anagrams",function() { - var detector = new Anagram("master"); - var matches = detector.match(['stream', 'pigeon', 'maters']); + it("detects multiple anagrams",function() { + var subject = anagram("master"); + var matches = subject.matches(['stream', 'pigeon', 'maters']); + expect(matches).toEqual(['stream', 'maters']); }); - xit("does not detect anagram subsets",function() { - var detector = new Anagram("good"); - var matches = detector.match(['dog', 'goody']); + it("does not detect anagram subsets",function() { + var subject = anagram("good"); + var matches = subject.matches(['dog', 'goody']); + expect(matches).toEqual([]); }); - xit("detects anagram",function() { - var detector = new Anagram("listen"); - var matches = detector.match(['enlists', 'google', 'inlets', 'banana']); + it("detects anagram",function() { + var subject = anagram("listen"); + var matches = subject.matches(['enlists', 'google', 'inlets', 'banana']); + expect(matches).toEqual(['inlets']); }); - xit("detects multiple anagrams",function() { - var detector = new Anagram("allergy"); - var matches = detector.match(['gallery', 'ballerina', 'regally', 'clergy', 'largely', 'leading']); + it("detects multiple anagrams",function() { + var subject = anagram("allergy"); + var matches = subject.matches(['gallery', 'ballerina', 'regally', 'clergy', 'largely', 'leading']); + expect(matches).toEqual(['gallery', 'regally', 'largely']); }); - xit("detects anagrams case-insensitively",function() { - var detector = new Anagram("Orchestra"); - var matches = detector.match(['cashregister', 'Carthorse', 'radishes']); + it("detects anagrams case-insensitively",function() { + var subject = anagram("Orchestra"); + var matches = subject.matches(['cashregister', 'Carthorse', 'radishes']); + expect(matches).toEqual(['Carthorse']); }); - xit("does not detect a word as its own anagram",function() { - var detector = new Anagram("banana"); - var matches = detector.match(['Banana']); + it("does not detect a word as its own anagram",function() { + var subject = anagram("banana"); + var matches = subject.matches(['Banana']); + expect(matches).toEqual([]); }); + }); diff --git a/anagram/example.js b/anagram/example.js index 0e0b6b34..c1e72243 100644 --- a/anagram/example.js +++ b/anagram/example.js @@ -1,34 +1,30 @@ -(function() { - 'use strict'; +"use strict"; +module.exports = anagram; - function Anagram(word) { - this.word = word.toLowerCase(); - } - - Anagram.prototype.match = function(words) { - var matches = []; - - for(var i = 0; i < words.length; i++) { - var currentWord = words[i]; +function anagram(word) { + return { + // public API + matches: matches.bind(this, word) + }; +} - if (currentWord.length == this.word.length && currentWord.toLowerCase() != this.word) { - var currentWordLetters = currentWord.toLowerCase().split('').sort(); - var matchingWordLetters = this.word.split('').sort(); +function matches(word, words) { + words = Array.isArray(words) ? words : [words]; - var isMatch = true; + return words.filter(function (candidate) { + return !sameWord(word, candidate) && isAnagram(word, candidate); + }); +} - for (var j = 0; j < currentWordLetters.length; j++) { - if (currentWordLetters[j] != matchingWordLetters[j]) { - isMatch = false; - } - } +function sameWord(word, candidate) { + return word.toLowerCase() === candidate.toLowerCase(); +} - if (isMatch) { matches.push(currentWord); } - } +function isAnagram(word, candiate) { + return normalize(word) === normalize(candiate); +} - } - return matches; - }; +function normalize(string) { + return string.toLowerCase().split("").sort().toString(); +} - module.exports = Anagram; -})(); From 3e7e64b8a7623318697dff1a2f04e6a89a8d185c Mon Sep 17 00:00:00 2001 From: Dmitry Pashkevich Date: Thu, 17 Apr 2014 00:14:43 -0600 Subject: [PATCH 2/3] accept a string as an argument --- anagram/anagram_test.spec.js | 7 +++++++ anagram/example.js | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/anagram/anagram_test.spec.js b/anagram/anagram_test.spec.js index e2a6e688..6e331114 100644 --- a/anagram/anagram_test.spec.js +++ b/anagram/anagram_test.spec.js @@ -65,4 +65,11 @@ describe('Anagram', function() { expect(matches).toEqual([]); }); + it("matches() accepts string arguments",function() { + var subject = anagram("ant"); + var matches = subject.matches("stand", "tan", "at"); + + expect(matches).toEqual(["tan"]); + }); + }); diff --git a/anagram/example.js b/anagram/example.js index c1e72243..5e582ffe 100644 --- a/anagram/example.js +++ b/anagram/example.js @@ -9,7 +9,7 @@ function anagram(word) { } function matches(word, words) { - words = Array.isArray(words) ? words : [words]; + words = Array.isArray(words) ? words : [].slice.call(arguments, 1); return words.filter(function (candidate) { return !sameWord(word, candidate) && isAnagram(word, candidate); From 46fa645b96b9d821bc2b9155de33f881ad649a0d Mon Sep 17 00:00:00 2001 From: Wil Moore III Date: Thu, 17 Apr 2014 00:17:49 -0600 Subject: [PATCH 3/3] skip tests 2..end --- anagram/anagram_test.spec.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/anagram/anagram_test.spec.js b/anagram/anagram_test.spec.js index 6e331114..5c8aa84a 100644 --- a/anagram/anagram_test.spec.js +++ b/anagram/anagram_test.spec.js @@ -9,63 +9,63 @@ describe('Anagram', function() { expect(matches).toEqual([]); }); - it("detects simple anagram",function() { + xit("detects simple anagram",function() { var subject = anagram("ant"); var matches = subject.matches(['tan', 'stand', 'at']); expect(matches).toEqual(['tan']); }); - it("does not detect false positives",function() { + xit("does not detect false positives",function() { var subject = anagram("galea"); var matches = subject.matches(["eagle"]); expect(matches).toEqual([]); }); - it("detects multiple anagrams",function() { + xit("detects multiple anagrams",function() { var subject = anagram("master"); var matches = subject.matches(['stream', 'pigeon', 'maters']); expect(matches).toEqual(['stream', 'maters']); }); - it("does not detect anagram subsets",function() { + xit("does not detect anagram subsets",function() { var subject = anagram("good"); var matches = subject.matches(['dog', 'goody']); expect(matches).toEqual([]); }); - it("detects anagram",function() { + xit("detects anagram",function() { var subject = anagram("listen"); var matches = subject.matches(['enlists', 'google', 'inlets', 'banana']); expect(matches).toEqual(['inlets']); }); - it("detects multiple anagrams",function() { + xit("detects multiple anagrams",function() { var subject = anagram("allergy"); var matches = subject.matches(['gallery', 'ballerina', 'regally', 'clergy', 'largely', 'leading']); expect(matches).toEqual(['gallery', 'regally', 'largely']); }); - it("detects anagrams case-insensitively",function() { + xit("detects anagrams case-insensitively",function() { var subject = anagram("Orchestra"); var matches = subject.matches(['cashregister', 'Carthorse', 'radishes']); expect(matches).toEqual(['Carthorse']); }); - it("does not detect a word as its own anagram",function() { + xit("does not detect a word as its own anagram",function() { var subject = anagram("banana"); var matches = subject.matches(['Banana']); expect(matches).toEqual([]); }); - it("matches() accepts string arguments",function() { + xit("matches() accepts string arguments",function() { var subject = anagram("ant"); var matches = subject.matches("stand", "tan", "at");