/// /// var assert = chai.assert; module Categorizer { describe("categorizer", () => { describe("topLevelNamespaceCategorizer", () => { it("returns empty array on empty tags", () => { assert.lengthOf(topLevelNamespaceCategorizer([]), 0); }); it("handles a simple case", () => { var simple = ["foo1/bar", "foo1/zod", "foo2/bar", "foo2/zod", "gosh/lod/mar", "gosh/lod/ned"]; var expected = [ { name: "foo1", tags: ["foo1/bar", "foo1/zod"] }, { name: "foo2", tags: ["foo2/bar", "foo2/zod"] }, { name: "gosh", tags: ["gosh/lod/mar", "gosh/lod/ned"] }, ]; assert.deepEqual(topLevelNamespaceCategorizer(simple), expected); }); it("orders the categories", () => { var test = ["e", "f", "g", "a", "b", "c"]; var expected = [ { name: "a", tags: ["a"] }, { name: "b", tags: ["b"] }, { name: "c", tags: ["c"] }, { name: "e", tags: ["e"] }, { name: "f", tags: ["f"] }, { name: "g", tags: ["g"] }, ]; assert.deepEqual(topLevelNamespaceCategorizer(test), expected); }); it("handles cases where category names overlap node names", () => { var test = ["a", "a/a", "a/b", "a/c", "b", "b/a"]; var actual = topLevelNamespaceCategorizer(test); var expected = [ { name: "a", tags: ["a", "a/a", "a/b", "a/c"] }, { name: "b", tags: ["b", "b/a"] }, ]; assert.deepEqual(actual, expected); }); it("handles singleton case", () => { assert.deepEqual(topLevelNamespaceCategorizer(["a"]), [{ name: "a", tags: ["a"] }]); }); }); describe("legacyUnderscoreCategorizer", () => { it("splits by shorter of first _ or /", () => { var tags = ["l0_bar/foo", "l0_bar/baz", "l0_foo/wob", "l1_zoink/bla", "l1_wibble/woz", "l1/foo_woink", "l2/wozzle_wizzle"]; var actual = legacyUnderscoreCategorizer(tags); var expected = [ { name: "l0", tags: ["l0_bar/baz", "l0_bar/foo", "l0_foo/wob"] }, { name: "l1", tags: ["l1/foo_woink", "l1_wibble/woz", "l1_zoink/bla"] }, { name: "l2", tags: ["l2/wozzle_wizzle"] }, ]; assert.deepEqual(actual, expected); }); }); describe("customCategorizer", () => { function noFallbackCategorizer(tags: string[]): Category[] { return []; } function testCategorizer(defs: string[], fallback: Categorizer, tags: string[]): Category[] { var catDefs = defs.map(defineCategory); return _categorizer(catDefs, fallback)(tags); } it("categorizes by regular expression", () => { var defs = ["foo..", "bar.."]; var tags = ["fooab", "fooxa", "barts", "barms"]; var actual = testCategorizer(defs, noFallbackCategorizer, tags); var expected = [ { name: "foo..", tags: ["fooab", "fooxa"] }, { name: "bar..", tags: ["barms", "barts"] }, ]; assert.deepEqual(actual, expected); }); it("matches non-exclusively", () => { var tags = ["abc", "bar", "zod"]; var actual = testCategorizer(["...", "bar"], noFallbackCategorizer, tags); var expected = [ { name: "...", tags: ["abc", "bar", "zod"] }, { name: "bar", tags: ["bar"] }, ]; assert.deepEqual(actual, expected); }); it("creates categories for unmatched rules", () => { var actual = testCategorizer(["a", "b", "c"], noFallbackCategorizer, []); var expected = [ { name: "a", tags: [] }, { name: "b", tags: [] }, { name: "c", tags: [] }, ]; assert.deepEqual(actual, expected); }); it("category regexs work with special characters", () => { var defs = ["^\\w+$", "^\\d+$", "^\\/..$"]; var tags = ["foo", "3243", "/xa"]; var actual = testCategorizer(defs, noFallbackCategorizer, tags); var expected = [ { name: "^\\w+$", tags: ["3243", "foo"] }, { name: "^\\d+$", tags: ["3243"] }, { name: "^\\/..$", tags: ["/xa"] }, ]; assert.deepEqual(actual, expected); }); it("category tags are sorted", () => { var tags = ["a", "z", "c", "d", "e", "x", "f", "y", "g"]; var sorted = tags.slice().sort(); var expected = [{ name: ".*", tags: sorted}]; var actual = testCategorizer([".*"], noFallbackCategorizer, tags); assert.deepEqual(actual, expected); }); it("if nonexclusive: all tags passed to fallback", () => { var passedToDefault = null; function defaultCategorizer(tags: string[]): Category[] { passedToDefault = tags; return []; } var tags = ["foo", "bar", "foo123"]; testCategorizer(["foo"], defaultCategorizer, tags); assert.deepEqual(passedToDefault, tags); }); }); }); }