forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathunittests.js
More file actions
1 lines (1 loc) · 14.3 KB
/
Copy pathunittests.js
File metadata and controls
1 lines (1 loc) · 14.3 KB
1
define(function(require,exports,module){var SpecRunnerUtils=brackets.getModule("spec/SpecRunnerUtils"),PrefsCodeHints=require("./main"),testPreferences=JSON.parse(require("text!./unittest-files/preferences.json"));describe("unit:Preferences Code Hints",function(){var testContent,testDocument,testEditor,mockEditor;function extractHintList(hintList){return $.map(hintList,function($node){return $node.find(".hint-obj").text()})}function expectHints(provider){expect(provider.hasHints(testEditor,null)).toBe(!0);var hintObj=provider.getHints();return expect(hintObj).toBeTruthy(),hintObj.hints}function expectNoHints(provider){var hasHints=provider.hasHints(testEditor,null);hasHints?expect(provider.getHints(null)).toBe(null):expect(hasHints).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=expectHints(provider),hints,index=extractHintList(hintList).indexOf(expectedHint);return expect(index).not.toBe(-1),provider.insertHint(hintList[index])}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='{\n "closeBrackets": true,\n "insertHintOnTab": false,\n "language.fileExtensions": {\n "txt": "markdown"\n },\n "language.fileNames": {\n "README.txt": "markdown"\n },\n "language": {\n "javascript": {\n "spaceUnits": 4,\n "useTabChar": false\n },\n "php": {\n "tabSize": 4,\n "useTabChar":true,\n "closeBrackets":false\n }\n },\n "jslint.options": {\n "devel": true,\n "regexp": true\n },\n "linting.prefer": ["JSHint","JSLint"],\n \n "linting.usePreferredOnly" false, \n}',beforeEach(function(){mockEditor=SpecRunnerUtils.createMockEditor(testContent,"json",{startLine:0,endLine:30}),testEditor=mockEditor.editor,(testDocument=mockEditor.doc).file._name=".phcode.json",PrefsCodeHints._setupTestEnvironment(testDocument,testPreferences)}),afterEach(function(){testEditor.destroy(),testDocument=null}),describe("File name based hinting",function(){it("it should hint in .phcode.json",function(){testEditor.setCursorPos({line:1,ch:5}),expectHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:1,ch:20}),expectHints(PrefsCodeHints.hintProvider)}),it("it should hint in phcode.json",function(){testDocument.file._name="phcode.json",PrefsCodeHints._setupTestEnvironment(testDocument,testPreferences),testEditor.setCursorPos({line:1,ch:5}),expectHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:1,ch:20}),expectHints(PrefsCodeHints.hintProvider)}),it("it should NOT hint in other JSON files",function(){testDocument.file._name="package.json",PrefsCodeHints._setupTestEnvironment(testDocument,testPreferences),testEditor.setCursorPos({line:1,ch:5}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:1,ch:20}),expectNoHints(PrefsCodeHints.hintProvider)})}),describe("Key Hints",function(){it("should hint at the begininng of a key",function(){var hintList;testEditor.setCursorPos({line:9,ch:5}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"closeOthers.above"),testEditor.setCursorPos({line:10,ch:9}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"audio"),testEditor.setCursorPos({line:11,ch:13}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"closeBrackets")}),it("should hint in the center of a key",function(){var hintList;testEditor.setCursorPos({line:9,ch:9}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"language"),testEditor.setCursorPos({line:10,ch:14}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"javascript"),testEditor.setCursorPos({line:11,ch:18}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"spaceUnits")}),it("should hint at the end of a key",function(){var hintList;testEditor.setCursorPos({line:9,ch:13}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"language"),testEditor.setCursorPos({line:10,ch:19}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"javascript"),testEditor.setCursorPos({line:11,ch:23}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"spaceUnits")}),it("should NOT hint for blacklisted parent keys",function(){testEditor.setCursorPos({line:4,ch:9}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:4,ch:11}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:7,ch:9}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:7,ch:15}),expectNoHints(PrefsCodeHints.hintProvider)}),it("should NOT hint before initial quote of a key",function(){testEditor.setCursorPos({line:1,ch:4}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:9,ch:4}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:10,ch:8}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:11,ch:12}),expectNoHints(PrefsCodeHints.hintProvider)}),it("should NOT hint after final quote of a key",function(){testEditor.setCursorPos({line:1,ch:19}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:9,ch:14}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:10,ch:20}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:11,ch:24}),expectNoHints(PrefsCodeHints.hintProvider)}),it("should NOT include keys already used in the context of current object",function(){var hintList;testEditor.setCursorPos({line:2,ch:5}),verifyHintsExcluded(hintList=expectHints(PrefsCodeHints.hintProvider),"closeBrackets"),verifyHintsExcluded(hintList,"language.fileExtensions"),verifyHintsExcluded(hintList,"language.fileNames"),verifyHintsExcluded(hintList,"language"),verifyHintsExcluded(hintList,"jslint.options"),verifyHintsExcluded(hintList,"linting.prefer"),verifyHintsExcluded(hintList,"linting.usePreferredOnly"),testEditor.setCursorPos({line:15,ch:13}),verifyHintsExcluded(hintList=expectHints(PrefsCodeHints.hintProvider),"useTabChar"),verifyHintsExcluded(hintList,"closeBrackets")})}),describe("Value Hints",function(){it("should hint after a colon",function(){var hintList;testEditor.setCursorPos({line:1,ch:20}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false"),testEditor.setCursorPos({line:2,ch:22}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false"),testEditor.setCursorPos({line:12,ch:25}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false")}),it("should hint after after a space followed by a colon",function(){var hintList;testEditor.setCursorPos({line:1,ch:21}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false"),testEditor.setCursorPos({line:2,ch:23}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false"),testEditor.setCursorPos({line:12,ch:26}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false")}),it("should hint even if space is missing after a colon",function(){var hintList;testEditor.setCursorPos({line:16,ch:25}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false"),testEditor.setCursorPos({line:17,ch:28}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false")}),it("should hint at the beginning of value",function(){var hintList;testEditor.setCursorPos({line:1,ch:22}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"true"),testEditor.setCursorPos({line:2,ch:24}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false"),testEditor.setCursorPos({line:12,ch:27}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false")}),it("should hint at the center of value",function(){var hintList;testEditor.setCursorPos({line:1,ch:24}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"true"),testEditor.setCursorPos({line:2,ch:26}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false"),testEditor.setCursorPos({line:12,ch:29}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false")}),it("should hint at the end of the value",function(){var hintList;testEditor.setCursorPos({line:1,ch:25}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"true"),testEditor.setCursorPos({line:2,ch:28}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false"),testEditor.setCursorPos({line:12,ch:31}),verifyHints(hintList=expectHints(PrefsCodeHints.hintProvider),"false")}),it("should NOT hint if the corresponding colon is missing",function(){testEditor.setCursorPos({line:26,ch:30}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:26,ch:31}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:26,ch:32}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:26,ch:34}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:26,ch:36}),expectNoHints(PrefsCodeHints.hintProvider)}),it("should NOT hint after a comma",function(){testEditor.setCursorPos({line:1,ch:26}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:2,ch:29}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:13,ch:10}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:19,ch:6}),expectNoHints(PrefsCodeHints.hintProvider)}),it("should NOT hint before opening braces",function(){testEditor.setCursorPos({line:10,ch:22}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:10,ch:23}),expectNoHints(PrefsCodeHints.hintProvider)}),it("should NOT hint after closing braces",function(){testEditor.setCursorPos({line:13,ch:9}),expectNoHints(PrefsCodeHints.hintProvider),testEditor.setCursorPos({line:19,ch:5}),expectNoHints(PrefsCodeHints.hintProvider)}),it("should NOT hint before opening brackets",function(){testEditor.setCursorPos({line:10,ch:22}),expectNoHints(PrefsCodeHints.hintProvider)}),it("should NOT hint after closing brackets",function(){testEditor.setCursorPos({line:10,ch:22}),expectNoHints(PrefsCodeHints.hintProvider)})}),describe("Key Insertion",function(){it("should enter entire key after initial quote is typed",function(){testDocument.replaceRange('"',{line:25,ch:4}),testEditor.setCursorPos({line:25,ch:5}),selectHint(PrefsCodeHints.hintProvider,"closeOthers.above"),expectTokenAt({line:25,ch:22},'"closeOthers.above"',"string property"),expectTokenAt({line:25,ch:24},":",null),expectCursorAt({line:25,ch:25})}),it("should enter entire key after first letter of a key is typed",function(){testDocument.replaceRange('"c',{line:25,ch:4}),testEditor.setCursorPos({line:25,ch:6}),selectHint(PrefsCodeHints.hintProvider,"closeOthers.above"),expectTokenAt({line:25,ch:22},'"closeOthers.above"',"string property"),expectTokenAt({line:25,ch:24},":",null),expectCursorAt({line:25,ch:25})}),it("should enter entire key after few initial letters are typed",function(){testDocument.replaceRange('"close',{line:25,ch:4}),testEditor.setCursorPos({line:25,ch:10}),selectHint(PrefsCodeHints.hintProvider,"closeOthers.above"),expectTokenAt({line:25,ch:22},'"closeOthers.above"',"string property"),expectTokenAt({line:25,ch:24},":",null),expectCursorAt({line:25,ch:25})}),it("should replace existing key after few initial letter are typed",function(){testDocument.replaceRange('"closeOthers.above": true,',{line:25,ch:4}),testEditor.setCursorPos({line:25,ch:17}),selectHint(PrefsCodeHints.hintProvider,"closeOthers.below"),expectTokenAt({line:25,ch:22},'"closeOthers.below"',"string property"),expectTokenAt({line:25,ch:24},":",null),expectCursorAt({line:25,ch:23})}),it("should append braces to a hint in case it is an object",function(){testDocument.replaceRange('"',{line:25,ch:4}),testEditor.setCursorPos({line:25,ch:5}),selectHint(PrefsCodeHints.hintProvider,"closeTags"),expectTokenAt({line:25,ch:14},'"closeTags"',"string property"),expectTokenAt({line:25,ch:16},":",null),expectTokenAt({line:25,ch:18},"{",null),expectTokenAt({line:25,ch:19},"}",null),expectCursorAt({line:25,ch:18})}),it("should append brackets to a hint in case it in an array",function(){testDocument.replaceRange('"closeTags": { "" }',{line:25,ch:4}),testEditor.setCursorPos({line:25,ch:20}),selectHint(PrefsCodeHints.hintProvider,"indentTags"),expectTokenAt({line:25,ch:30},'"indentTags"',"string property"),expectTokenAt({line:25,ch:32},":",null),expectTokenAt({line:25,ch:34},"[",null),expectTokenAt({line:25,ch:35},"]",null),expectCursorAt({line:25,ch:34})}),it("should NOT replace colon and braces/brackets if they already exists",function(){testEditor.setCursorPos({line:1,ch:10}),expectTokenAt({line:1,ch:20},":",null),selectHint(PrefsCodeHints.hintProvider,"closeOthers.above"),expectTokenAt({line:1,ch:24},":",null)})}),describe("Value Insertion",function(){it("should insert a value of type Boolean",function(){testDocument.replaceRange('"closeOthers.above":,',{line:25,ch:4}),testEditor.setCursorPos({line:25,ch:24}),selectHint(PrefsCodeHints.hintProvider,"true"),expectTokenAt({line:25,ch:28},"true","atom"),expectCursorAt({line:25,ch:28})}),it("should replace current token when editing",function(){testDocument.replaceRange('"closeOthers.above": tru',{line:25,ch:4}),testEditor.setCursorPos({line:25,ch:28}),selectHint(PrefsCodeHints.hintProvider,"true"),expectTokenAt({line:25,ch:28},"true","atom"),expectCursorAt({line:25,ch:29})}),it("should insert a value of type String",function(){testDocument.replaceRange(',\n "pavement":',{line:7,ch:32}),testEditor.setCursorPos({line:8,ch:19}),selectHint(PrefsCodeHints.hintProvider,"python"),expectTokenAt({line:8,ch:27},'"python"',"string"),expectCursorAt({line:8,ch:27})}),it("should insert a value if the next token is also a value",function(){testEditor.setCursorPos({line:1,ch:21}),selectHint(PrefsCodeHints.hintProvider,"false"),expectTokenAt({line:1,ch:26},"false","atom"),expectCursorAt({line:1,ch:26}),testEditor.setCursorPos({line:24,ch:23}),selectHint(PrefsCodeHints.hintProvider,"JSLint"),expectTokenAt({line:24,ch:31},'"JSLint"',"string"),expectCursorAt({line:24,ch:31})})})})});