-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathunittests.js
More file actions
1 lines (1 loc) · 18.1 KB
/
unittests.js
File metadata and controls
1 lines (1 loc) · 18.1 KB
1
define(function(require,exports,module){var SpecRunnerUtils=brackets.getModule("spec/SpecRunnerUtils"),SVGCodeHints=require("./main");describe("unit:SVG Code Hints",function(){var testContent,testDocument,testEditor;function extractHintList(hints){return $.map(hints,function($node){return $node.text()})}function expectHints(provider){expect(provider.hasHints(testEditor,null)).toBe(!0);var hintObj=provider.getHints();return expect(hintObj).toBeTruthy(),hintObj.hints}function expectNoHints(provider){expect(provider.hasHints(testEditor,null)).toBe(!1)}function verifyHints(hintList,expectedHint){var hints=extractHintList(hintList);expect(hints[0]).toBe(expectedHint)}function verifyHintsExcluded(hintList,unexpectedHint){var hints=extractHintList(hintList);expect(hints.indexOf(unexpectedHint)).toBe(-1)}function selectHint(provider,expectedHint){var hintList,hints=extractHintList(expectHints(provider));return expect(hints.indexOf(expectedHint)).not.toBe(-1),provider.insertHint(expectedHint)}function expectTokenAt(pos,string,type){var token=testEditor._codeMirror.getTokenAt(pos);expect(token.string).toBe(string),expect(token.type).toBe(type)}function fixPos(pos){return"sticky"in pos||(pos.sticky=null),pos}function expectCursorAt(pos){var selection=testEditor.getSelection();expect(fixPos(selection.start)).toEql(fixPos(selection.end)),expect(fixPos(selection.start)).toEql(fixPos(pos))}testContent='<?xml version="1.0" encoding="UTF-8" ?>\n<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"\n width="200" height="200" preserveAspectRatio="xMinYMin meet">\n <title>Brackets SVG Code Hints</title>\n <rect width="200" height="200" baseline-shift="baseline" alignment-baseline="alphabetic" stroke-width="1" color=""></rect>\n'+" <rect width='160' height='160' x='20' y='20' baseline-shift='super' alignment-baseline='baseline' color='rent' fill='transparent' />\n <g>\n \n </g>\n</svg>\n",beforeEach(function(){var mockEditor=SpecRunnerUtils.createMockEditor(testContent,"svg",{startLine:0,endLine:10});testEditor=mockEditor.editor,testDocument=mockEditor.doc}),afterEach(function(){testEditor.destroy(),testEditor=null}),describe("Tag Hinting",function(){it("should hint at < before tag name",function(){var hintList;testEditor.setCursorPos({line:1,ch:1}),verifyHints(expectHints(SVGCodeHints.hintProvider),"a")}),it("should hint inside the tag name",function(){var hintList;testEditor.setCursorPos({line:1,ch:3}),verifyHints(expectHints(SVGCodeHints.hintProvider),"svg")}),it("should hint at the end of the tag",function(){var hintList;testEditor.setCursorPos({line:1,ch:4}),verifyHints(expectHints(SVGCodeHints.hintProvider),"svg")}),it("should NOT hint in closing tag between < and /",function(){testEditor.setCursorPos({line:3,ch:35}),expectNoHints(SVGCodeHints.hintProvider),testDocument.replaceRange(" ",{line:3,ch:35}),testEditor.setCursorPos({line:3,ch:36}),expectNoHints(SVGCodeHints.hintProvider)}),it("should NOT hint in closing tag after </",function(){testEditor.setCursorPos({line:3,ch:36}),expectNoHints(SVGCodeHints.hintProvider)}),it("should NOT hint in the middle of closing tag",function(){testEditor.setCursorPos({line:3,ch:39}),expectNoHints(SVGCodeHints.hintProvider)}),it("should NOT hint at the end of closing tag",function(){testEditor.setCursorPos({line:3,ch:41}),expectNoHints(SVGCodeHints.hintProvider)}),it("should NOT hint after the first space in closing tag",function(){testDocument.replaceRange(" ",{line:3,ch:41}),testEditor.setCursorPos({line:3,ch:42}),expectNoHints(SVGCodeHints.hintProvider)}),it("should NOT hint in case there is a whitespace between < and tag name",function(){testDocument.replaceRange(" ",{line:4,ch:5}),testEditor.setCursorPos({line:4,ch:6}),expectNoHints(SVGCodeHints.hintProvider)}),it("should NOT hint after first character in an invalid tag",function(){testDocument.replaceRange(" ",{line:4,ch:5}),testEditor.setCursorPos({line:4,ch:7}),expectNoHints(SVGCodeHints.hintProvider)}),it("should NOT hint in the middle of invalid tag",function(){testDocument.replaceRange(" ",{line:4,ch:5}),testEditor.setCursorPos({line:4,ch:9}),expectNoHints(SVGCodeHints.hintProvider)}),it("should NOT hint inside the content of a tag",function(){testEditor.setCursorPos({line:3,ch:11}),expectNoHints(SVGCodeHints.hintProvider),testEditor.setCursorPos({line:3,ch:20}),expectNoHints(SVGCodeHints.hintProvider),testEditor.setCursorPos({line:4,ch:119}),expectNoHints(SVGCodeHints.hintProvider),testDocument.replaceRange(" ",{line:3,ch:11}),testEditor.setCursorPos({line:3,ch:12}),expectNoHints(SVGCodeHints.hintProvider)}),it("should not hint after the closed tag",function(){testEditor.setCursorPos({line:4,ch:126}),expectNoHints(SVGCodeHints.hintProvider),testDocument.replaceRange(" ",{line:4,ch:126}),testEditor.setCursorPos({line:4,ch:127}),expectNoHints(SVGCodeHints.hintProvider),testEditor.setCursorPos({line:5,ch:136}),expectNoHints(SVGCodeHints.hintProvider),testDocument.replaceRange(" ",{line:5,ch:136}),testEditor.setCursorPos({line:5,ch:137}),expectNoHints(SVGCodeHints.hintProvider),testEditor.setCursorPos({line:8,ch:8}),expectNoHints(SVGCodeHints.hintProvider),testDocument.replaceRange(" ",{line:8,ch:8}),testEditor.setCursorPos({line:8,ch:9}),expectNoHints(SVGCodeHints.hintProvider)}),it("should hint inside XML declaration",function(){testEditor.setCursorPos({line:0,ch:1}),expectNoHints(SVGCodeHints.hintProvider),testEditor.setCursorPos({line:0,ch:4}),expectNoHints(SVGCodeHints.hintProvider),testEditor.setCursorPos({line:0,ch:6}),expectNoHints(SVGCodeHints.hintProvider)})}),describe("Attribute Hinting",function(){it("should hint after first space after tag",function(){var hintList;testEditor.setCursorPos({line:4,ch:10}),verifyHints(expectHints(SVGCodeHints.hintProvider),"class")}),it("should hint after first character of the attribute",function(){var hintList;testEditor.setCursorPos({line:4,ch:11}),verifyHints(expectHints(SVGCodeHints.hintProvider),"width")}),it("should hint in the middle of the attribute",function(){var hintList;testEditor.setCursorPos({line:4,ch:13}),verifyHints(expectHints(SVGCodeHints.hintProvider),"width")}),it("should hint at the end of the attribute",function(){var hintList;testEditor.setCursorPos({line:4,ch:15}),verifyHints(expectHints(SVGCodeHints.hintProvider),"width")}),it("should NOT hint if we have whitespace between attribute and =",function(){testDocument.replaceRange(" ",{line:4,ch:15}),testEditor.setCursorPos({line:4,ch:16}),expectNoHints(SVGCodeHints.hintProvider)}),it("should NOT hint in case there is a space between < and tag name",function(){testDocument.replaceRange(" ",{line:4,ch:5}),testEditor.setCursorPos({line:4,ch:11}),expectNoHints(SVGCodeHints.hintProvider)}),it("should exclude hints if they have already been used",function(){testEditor.setCursorPos({line:4,ch:10});var hintLint=expectHints(SVGCodeHints.hintProvider);verifyHintsExcluded(hintLint,"width"),verifyHintsExcluded(hintLint,"height"),verifyHintsExcluded(hintLint,"baseline-shift"),verifyHintsExcluded(hintLint,"alignment-baseline"),verifyHintsExcluded(hintLint,"stroke-width"),testEditor.setCursorPos({line:5,ch:10}),verifyHintsExcluded(hintLint=expectHints(SVGCodeHints.hintProvider),"width"),verifyHintsExcluded(hintLint,"height"),verifyHintsExcluded(hintLint,"x"),verifyHintsExcluded(hintLint,"y"),verifyHintsExcluded(hintLint,"baseline-shift"),verifyHintsExcluded(hintLint,"alignment-baseline")}),it("should NOT exclude current token from hints",function(){var hintList,hints;testEditor.setCursorPos({line:4,ch:11}),hints=extractHintList(hintList=expectHints(SVGCodeHints.hintProvider)),expect(hints.indexOf("width")).not.toBe(-1),testEditor.setCursorPos({line:4,ch:14}),hints=extractHintList(hintList=expectHints(SVGCodeHints.hintProvider)),expect(hints.indexOf("width")).not.toBe(-1),testEditor.setCursorPos({line:5,ch:15}),hints=extractHintList(hintList=expectHints(SVGCodeHints.hintProvider)),expect(hints.indexOf("width")).not.toBe(-1)})}),describe("Value Hinting",function(){it("should hint after =",function(){var hintList;testEditor.setCursorPos({line:5,ch:64}),verifyHints(expectHints(SVGCodeHints.hintProvider),"baseline")}),it("should hint after ='",function(){var hintList;testEditor.setCursorPos({line:5,ch:65}),verifyHints(expectHints(SVGCodeHints.hintProvider),"baseline")}),it('should hint after ="',function(){var hintList;testEditor.setCursorPos({line:4,ch:51}),verifyHints(expectHints(SVGCodeHints.hintProvider),"baseline")}),it("should hint after first character",function(){var hintList;testEditor.setCursorPos({line:4,ch:52}),verifyHints(expectHints(SVGCodeHints.hintProvider),"baseline")}),it("should hint in the middle of value",function(){var hintList;testEditor.setCursorPos({line:4,ch:55}),verifyHints(expectHints(SVGCodeHints.hintProvider),"baseline")}),it("should hint at the end of the value",function(){var hintList;testEditor.setCursorPos({line:4,ch:59}),verifyHints(expectHints(SVGCodeHints.hintProvider),"baseline")}),it("should hint for first attribute in multiple options",function(){var hintList;testEditor.setCursorPos({line:2,ch:52}),verifyHints(expectHints(SVGCodeHints.hintProvider),"xMaxYMax")}),it("should hint for second value in multiple options",function(){var hintList;testEditor.setCursorPos({line:2,ch:61}),verifyHints(expectHints(SVGCodeHints.hintProvider),"meet")}),it("should hint in middle of value in muliple options with empty query",function(){var hintLint;testDocument.replaceRange(" ",{line:2,ch:59}),testEditor.setCursorPos({line:2,ch:60}),verifyHints(expectHints(SVGCodeHints.hintProvider),"none")}),it("should hint in middle of value in multiple options with a query",function(){var hintLint;testDocument.replaceRange(" sli",{line:2,ch:59}),testEditor.setCursorPos({line:2,ch:63}),verifyHints(expectHints(SVGCodeHints.hintProvider),"slice")}),it("should NOT hint in case cursor is out of right quote",function(){testEditor.setCursorPos({line:2,ch:65}),expectNoHints(SVGCodeHints.hintProvider)}),it("should NOT hint in an invalid tag",function(){testDocument.replaceRange(" ",{line:4,ch:5}),testEditor.setCursorPos({line:4,ch:42}),expectNoHints(SVGCodeHints.hintProvider)}),it("should exclude a value if it is already been used",function(){testDocument.replaceRange(" ",{line:2,ch:59}),testEditor.setCursorPos({line:2,ch:60});var hintLint=expectHints(SVGCodeHints.hintProvider);verifyHintsExcluded(hintLint,"xMinYMin"),verifyHintsExcluded(hintLint,"meet")}),it("should NOT exclude current query from hints",function(){var hintList,hints;testDocument.replaceRange(" xMax",{line:2,ch:59}),testEditor.setCursorPos({line:2,ch:64}),hints=extractHintList(hintList=expectHints(SVGCodeHints.hintProvider)),expect(hints.indexOf("xMaxYMax")).not.toBe(-1)})}),describe("Color names and swatches",function(){it("should show color swatches",function(){testEditor.setCursorPos({line:4,ch:117});var hints=expectHints(SVGCodeHints.hintProvider);verifyHints(hints,"aliceblue"),expect(hints[0].find(".color-swatch").length).toBe(1),expect(hints[0].find(".color-swatch").css("backgroundColor")).toMatch(/^rgb\(240, 248, 255\)$|aliceblue/)}),it("should always include transparent and currentColor and they should not have a swatch, but class no-swatch-margin",function(){testEditor.setCursorPos({line:5,ch:113});var hints=expectHints(SVGCodeHints.hintProvider);verifyHints(hints,"currentColor"),expect(hints[0].find(".color-swatch").length).toBe(0),expect(hints[2].find(".color-swatch").length).toBe(0),expect(hints[0].hasClass("no-swatch-margin")).toBeTruthy(),expect(hints[2].hasClass("no-swatch-margin")).toBeTruthy()}),it("should remove class no-swatch-margin from transparent if it's the only one in the list",function(){testEditor.setCursorPos({line:5,ch:132});var hints=expectHints(SVGCodeHints.hintProvider);verifyHints(hints,"transparent"),expect(hints.length).toBe(1),expect(hints[0].find(".color-swatch").length).toBe(0),expect(hints[0].hasClass("no-swatch-margin")).toBeFalsy()})}),describe("Tag Insertion",function(){it("should insert if query is empty",function(){testDocument.replaceRange("<",{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:9}),selectHint(SVGCodeHints.hintProvider,"a"),expectTokenAt({line:7,ch:10},"a","tag"),expectCursorAt({line:7,ch:10})}),it("should insert if query is one character long",function(){testDocument.replaceRange("<d",{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:10}),selectHint(SVGCodeHints.hintProvider,"defs"),expectTokenAt({line:7,ch:11},"defs","tag"),expectCursorAt({line:7,ch:13})}),it("should insert if query is complete",function(){testDocument.replaceRange("<defs",{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:13}),selectHint(SVGCodeHints.hintProvider,"defs"),expectTokenAt({line:7,ch:13},"defs","tag"),expectCursorAt({line:7,ch:13})})}),describe("Attribute Insertion",function(){it("should insert if query is empty",function(){testDocument.replaceRange("<defs ",{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:14}),selectHint(SVGCodeHints.hintProvider,"alignment-baseline"),expectTokenAt({line:7,ch:32},"alignment-baseline","attribute"),expectTokenAt({line:7,ch:33},"=",null),expectTokenAt({line:7,ch:35},'""',"string"),expectCursorAt({line:7,ch:34})}),it("should insert if query is one character long",function(){testDocument.replaceRange("<defs b",{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:15}),selectHint(SVGCodeHints.hintProvider,"baseline-shift"),expectTokenAt({line:7,ch:28},"baseline-shift","attribute"),expectTokenAt({line:7,ch:29},"=",null),expectTokenAt({line:7,ch:31},'""',"string"),expectCursorAt({line:7,ch:30})}),it("should insert if query is complete",function(){testDocument.replaceRange("<defs clip-path",{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:23}),selectHint(SVGCodeHints.hintProvider,"clip-path"),expectTokenAt({line:7,ch:23},"clip-path","attribute"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:26},'""',"string"),expectCursorAt({line:7,ch:25})}),it("should NOT overide =",function(){testDocument.replaceRange('<defs clip-path="inherit"',{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:18}),expectTokenAt({line:7,ch:24},"=",null),selectHint(SVGCodeHints.hintProvider,"clip-rule"),expectTokenAt({line:7,ch:23},"clip-rule","attribute"),expectTokenAt({line:7,ch:24},"=",null),expectCursorAt({line:7,ch:23})})}),describe("Value Insertion",function(){it("should insert if = is typed after an attribute",function(){testDocument.replaceRange("<defs clip-path=",{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:24}),selectHint(SVGCodeHints.hintProvider,"inherit"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:33},'"inherit"',"string"),expectCursorAt({line:7,ch:33})}),it('should insert if =" is typed after an attribute',function(){testDocument.replaceRange('<defs clip-path="',{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:25}),selectHint(SVGCodeHints.hintProvider,"inherit"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:33},'"inherit"',"string"),expectCursorAt({line:7,ch:33})}),it("should insert if =' is typed after an attribute",function(){testDocument.replaceRange("<defs clip-path='",{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:25}),selectHint(SVGCodeHints.hintProvider,"inherit"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:33},"'inherit'","string"),expectCursorAt({line:7,ch:33})}),it('should insert if first character is typed after ="',function(){testDocument.replaceRange('<defs clip-path="i',{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:26}),selectHint(SVGCodeHints.hintProvider,"inherit"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:33},'"inherit"',"string"),expectCursorAt({line:7,ch:33})}),it("should insert if first character is typed after ='",function(){testDocument.replaceRange("<defs clip-path='i",{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:26}),selectHint(SVGCodeHints.hintProvider,"inherit"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:33},"'inherit'","string"),expectCursorAt({line:7,ch:33})}),it('should insert if we are in middle of query after ="',function(){testDocument.replaceRange('<defs clip-path="inhe',{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:29}),selectHint(SVGCodeHints.hintProvider,"inherit"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:33},'"inherit"',"string"),expectCursorAt({line:7,ch:33})}),it("should insert if we are in middle of query after ='",function(){testDocument.replaceRange("<defs clip-path='inhe",{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:29}),selectHint(SVGCodeHints.hintProvider,"inherit"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:33},"'inherit'","string"),expectCursorAt({line:7,ch:33})}),it("should insert if we are in the end of value after ='",function(){testDocument.replaceRange("<defs clip-path='inherit'",{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:32}),selectHint(SVGCodeHints.hintProvider,"inherit"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:33},"'inherit'","string"),expectCursorAt({line:7,ch:33})}),it('should insert if we are in the end of value after ="',function(){testDocument.replaceRange('<defs clip-path="inherit"',{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:32}),selectHint(SVGCodeHints.hintProvider,"inherit"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:33},'"inherit"',"string"),expectCursorAt({line:7,ch:33})}),it("should insert value to left in a multiple options attribute",function(){testDocument.replaceRange('<rect transform=""',{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:25}),selectHint(SVGCodeHints.hintProvider,"matrix()"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:34},'"matrix()"',"string"),expectCursorAt({line:7,ch:34})}),it("should insert value to the right in a multiple options attribute",function(){testDocument.replaceRange('<rect transform="matrix() "',{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:34}),selectHint(SVGCodeHints.hintProvider,"rotate()"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:34},'"matrix() rotate()"',"string"),expectCursorAt({line:7,ch:43})}),it("should insert value in the middle in a multiple options attribute",function(){testDocument.replaceRange('<rect transform="matrix() rotate()"',{line:7,ch:8}),testEditor.setCursorPos({line:7,ch:34}),selectHint(SVGCodeHints.hintProvider,"scale()"),expectTokenAt({line:7,ch:24},"=",null),expectTokenAt({line:7,ch:34},'"matrix() scale() rotate()"',"string"),expectCursorAt({line:7,ch:41})})})})});