// Copyright 2012 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.collide.client.code.autocomplete.html; import com.google.collide.client.testutil.SynchronousTestCase; import com.google.collide.codemirror2.CodeMirror2; import com.google.collide.codemirror2.Token; import com.google.collide.codemirror2.TokenType; import com.google.collide.json.shared.JsonArray; import com.google.collide.json.shared.JsonStringMap; import com.google.collide.shared.TaggableLine; import com.google.collide.shared.util.JsonCollections; /** * Tests for xml {@link XmlCodeAnalyzer} * */ public class XmlCodeAnalyzerTest extends SynchronousTestCase { private static class MockTagHolder implements TaggableLine { JsonStringMap<Object> tags = JsonCollections.createMap(); @Override @SuppressWarnings("unchecked") public <T> T getTag(String key) { return (T) tags.get(key); } @Override public <T> void putTag(String key, T value) { tags.put(key, value); } @Override public TaggableLine getPreviousLine() { throw new IllegalStateException("unexpected call"); } @Override public boolean isFirstLine() { return false; } @Override public boolean isLastLine() { return false; } } @Override public String getModuleName() { return "com.google.collide.client.TestCode"; } public void testParse() { XmlCodeAnalyzer codeAnalyzer = new XmlCodeAnalyzer(); JsonArray<TaggableLine> lines = JsonCollections.createArray(); JsonArray<JsonArray<Token>> tokens = JsonCollections.createArray(); // NOTE: 0 is used for line before the beginning of document. for (int i = 0; i <= 3; i++) { lines.add(new MockTagHolder()); tokens.add(JsonCollections.<Token>createArray()); } JsonArray<Token> lineTokens; lineTokens = tokens.get(1); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.TAG, "<html")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "first")); lineTokens = tokens.get(2); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "second")); lineTokens = tokens.get(3); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "third")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.TAG, ">")); codeAnalyzer.onBeforeParse(); for (int i = 1; i <= 3; i++) { codeAnalyzer.onParseLine(lines.get(i - 1), lines.get(i), tokens.get(i)); } codeAnalyzer.onAfterParse(); assertNull(lines.get(1).getTag(XmlCodeAnalyzer.TAG_START_TAG)); HtmlTagWithAttributes tag = lines.get(1).getTag(XmlCodeAnalyzer.TAG_END_TAG); assertNotNull(tag); assertEquals("html", tag.getTagName()); assertTrue(tag.getAttributes().contains("first")); assertTrue(tag.getAttributes().contains("second")); assertTrue(tag.getAttributes().contains("third")); assertTrue(tag == lines.get(2).getTag(XmlCodeAnalyzer.TAG_START_TAG)); assertTrue(tag == lines.get(2).getTag(XmlCodeAnalyzer.TAG_END_TAG)); assertTrue(tag == lines.get(3).getTag(XmlCodeAnalyzer.TAG_START_TAG)); assertNull(lines.get(3).getTag(XmlCodeAnalyzer.TAG_END_TAG)); } public void testReparse() { XmlCodeAnalyzer codeAnalyzer = new XmlCodeAnalyzer(); JsonArray<TaggableLine> lines = JsonCollections.createArray(); JsonArray<JsonArray<Token>> tokens = JsonCollections.createArray(); // NOTE: 0 is used for line before the beginning of document. for (int i = 0; i <= 3; i++) { lines.add(new MockTagHolder()); tokens.add(JsonCollections.<Token>createArray()); } JsonArray<Token> lineTokens; lineTokens = tokens.get(1); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.TAG, "<html")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "first")); lineTokens = tokens.get(2); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "second")); lineTokens = tokens.get(3); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "third")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.TAG, ">")); codeAnalyzer.onBeforeParse(); for (int i = 1; i <= 3; i++) { codeAnalyzer.onParseLine(lines.get(i - 1), lines.get(i), tokens.get(i)); } codeAnalyzer.onAfterParse(); lineTokens = tokens.get(2); lineTokens.clear(); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "fixed")); codeAnalyzer.onBeforeParse(); for (int i = 2; i <= 3; i++) { codeAnalyzer.onParseLine(lines.get(i - 1), lines.get(i), tokens.get(i)); } codeAnalyzer.onAfterParse(); assertNull(lines.get(1).getTag(XmlCodeAnalyzer.TAG_START_TAG)); HtmlTagWithAttributes tag = lines.get(1).getTag(XmlCodeAnalyzer.TAG_END_TAG); assertNotNull(tag); assertEquals("html", tag.getTagName()); assertTrue(tag.getAttributes().contains("first")); assertTrue(tag.getAttributes().contains("fixed")); assertTrue(tag.getAttributes().contains("third")); assertTrue(tag == lines.get(2).getTag(XmlCodeAnalyzer.TAG_START_TAG)); assertTrue(tag == lines.get(2).getTag(XmlCodeAnalyzer.TAG_END_TAG)); assertTrue(tag == lines.get(3).getTag(XmlCodeAnalyzer.TAG_START_TAG)); assertNull(lines.get(3).getTag(XmlCodeAnalyzer.TAG_END_TAG)); } public void testIntermediateTags() { XmlCodeAnalyzer codeAnalyzer = new XmlCodeAnalyzer(); JsonArray<TaggableLine> lines = JsonCollections.createArray(); JsonArray<JsonArray<Token>> tokens = JsonCollections.createArray(); // NOTE: 0 is used for line before the beginning of document. for (int i = 0; i <= 2; i++) { lines.add(new MockTagHolder()); tokens.add(JsonCollections.<Token>createArray()); } JsonArray<Token> lineTokens; lineTokens = tokens.get(1); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.TAG, "<first")); lineTokens = tokens.get(2); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "first")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.TAG, ">")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.TAG, "<second")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "second")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.TAG, ">")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.TAG, "<third")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "third")); codeAnalyzer.onBeforeParse(); for (int i = 1; i <= 2; i++) { codeAnalyzer.onParseLine(lines.get(i - 1), lines.get(i), tokens.get(i)); } codeAnalyzer.onAfterParse(); assertNull(lines.get(1).getTag(XmlCodeAnalyzer.TAG_START_TAG)); HtmlTagWithAttributes tag = lines.get(1).getTag(XmlCodeAnalyzer.TAG_END_TAG); assertNotNull(tag); assertEquals("first", tag.getTagName()); assertTrue(tag.getAttributes().contains("first")); assertTrue(tag == lines.get(2).getTag(XmlCodeAnalyzer.TAG_START_TAG)); assertFalse(tag == lines.get(2).getTag(XmlCodeAnalyzer.TAG_END_TAG)); tag = lines.get(2).getTag(XmlCodeAnalyzer.TAG_END_TAG); assertNotNull(tag); assertEquals("third", tag.getTagName()); assertTrue(tag.getAttributes().contains("third")); } public void testDeleteLine() { XmlCodeAnalyzer codeAnalyzer = new XmlCodeAnalyzer(); JsonArray<TaggableLine> lines = JsonCollections.createArray(); JsonArray<JsonArray<Token>> tokens = JsonCollections.createArray(); // NOTE: 0 is used for line before the beginning of document. for (int i = 0; i <= 3; i++) { lines.add(new MockTagHolder()); tokens.add(JsonCollections.<Token>createArray()); } JsonArray<Token> lineTokens; lineTokens = tokens.get(1); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.TAG, "<html")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "first")); lineTokens = tokens.get(2); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "second")); lineTokens = tokens.get(3); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.ATTRIBUTE, "third")); lineTokens.add(new Token(CodeMirror2.HTML, TokenType.TAG, ">")); codeAnalyzer.onBeforeParse(); for (int i = 1; i <= 3; i++) { codeAnalyzer.onParseLine(lines.get(i - 1), lines.get(i), tokens.get(i)); } codeAnalyzer.onAfterParse(); codeAnalyzer.onLinesDeleted(JsonCollections.createArray(lines.get(2))); assertNull(lines.get(1).getTag(XmlCodeAnalyzer.TAG_START_TAG)); HtmlTagWithAttributes tag = lines.get(1).getTag(XmlCodeAnalyzer.TAG_END_TAG); assertNotNull(tag); assertEquals("html", tag.getTagName()); assertTrue(tag.getAttributes().contains("first")); assertTrue(tag.getAttributes().contains("third")); } }