// 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.codegraph;
import com.google.collide.client.code.autocomplete.codegraph.js.JsCodeScope;
import com.google.collide.client.code.autocomplete.codegraph.js.JsIndexUpdater;
import com.google.collide.client.code.autocomplete.integration.TaggableLineUtil;
import com.google.collide.client.testutil.SynchronousTestCase;
import com.google.collide.codemirror2.SyntaxType;
import com.google.collide.codemirror2.Token;
import com.google.collide.codemirror2.TokenType;
import com.google.collide.json.shared.JsonArray;
import com.google.collide.shared.TaggableLine;
import com.google.collide.shared.document.Document;
import com.google.collide.shared.document.Line;
import com.google.collide.shared.util.JsonCollections;
/**
* Test cases for {@link JsIndexUpdater}
*
*/
public class JsIndexUpdaterTest extends SynchronousTestCase {
@Override
public String getModuleName() {
return "com.google.collide.client.TestCode";
}
public void testSimpleCases() {
String mode = SyntaxType.JS.getName();
String text = ""
+ "function a(b, c) {\n"
+ " d.prototype = function() {\n"
+ " }\n"
+ "}\n"
+ "var e = {\n"
+ " f : function ( ) {\n"
+ " callMyFunctionWithCallback(function(/* Knock-knock! */) {\n";
Document document = Document.createFromString(text);
Line line = document.getFirstLine();
TaggableLine previousLine;
JsonArray<Token> tokens1 = JsonCollections.createArray();
tokens1.add(new Token(mode, TokenType.KEYWORD, "function"));
tokens1.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens1.add(new Token(mode, TokenType.VARIABLE, "a"));
tokens1.add(new Token(mode, TokenType.NULL, "("));
tokens1.add(new Token(mode, TokenType.VARIABLE, "b"));
tokens1.add(new Token(mode, TokenType.NULL, ","));
tokens1.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens1.add(new Token(mode, TokenType.VARIABLE, "c"));
tokens1.add(new Token(mode, TokenType.NULL, ")"));
tokens1.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens1.add(new Token(mode, TokenType.NULL, "{"));
tokens1.add(new Token(mode, TokenType.NEWLINE, "\n"));
JsonArray<Token> tokens2 = JsonCollections.createArray();
tokens2.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens2.add(new Token(mode, TokenType.VARIABLE, "d"));
tokens2.add(new Token(mode, TokenType.NULL, "."));
tokens2.add(new Token(mode, TokenType.VARIABLE, "prototype"));
tokens2.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens2.add(new Token(mode, TokenType.NULL, "="));
tokens2.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens2.add(new Token(mode, TokenType.KEYWORD, "function"));
tokens2.add(new Token(mode, TokenType.NULL, "("));
tokens2.add(new Token(mode, TokenType.NULL, ")"));
tokens2.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens2.add(new Token(mode, TokenType.NULL, "{"));
tokens2.add(new Token(mode, TokenType.NEWLINE, "\n"));
JsonArray<Token> tokens3 = JsonCollections.createArray();
tokens3.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens3.add(new Token(mode, TokenType.NULL, "}"));
tokens3.add(new Token(mode, TokenType.NEWLINE, "\n"));
JsonArray<Token> tokens4 = JsonCollections.createArray();
tokens4.add(new Token(mode, TokenType.NULL, "}"));
tokens4.add(new Token(mode, TokenType.NEWLINE, "\n"));
JsonArray<Token> tokens5 = JsonCollections.createArray();
tokens5.add(new Token(mode, TokenType.KEYWORD, "var"));
tokens5.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens5.add(new Token(mode, TokenType.DEF, "e"));
tokens5.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens5.add(new Token(mode, TokenType.NULL, "="));
tokens5.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens5.add(new Token(mode, TokenType.NULL, "{"));
tokens5.add(new Token(mode, TokenType.NEWLINE, "\n"));
JsonArray<Token> tokens6 = JsonCollections.createArray();
tokens6.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens6.add(new Token(mode, TokenType.PROPERTY, "f"));
tokens6.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens6.add(new Token(mode, TokenType.NULL, ":"));
tokens6.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens6.add(new Token(mode, TokenType.KEYWORD, "function"));
tokens6.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens6.add(new Token(mode, TokenType.NULL, "("));
tokens6.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens6.add(new Token(mode, TokenType.NULL, ")"));
tokens6.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens6.add(new Token(mode, TokenType.NULL, "{"));
tokens6.add(new Token(mode, TokenType.NEWLINE, "\n"));
JsonArray<Token> tokens7 = JsonCollections.createArray();
tokens7.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens7.add(new Token(mode, TokenType.VARIABLE, "callMyFunctionWithCallback"));
tokens7.add(new Token(mode, TokenType.NULL, "("));
tokens7.add(new Token(mode, TokenType.KEYWORD, "function"));
tokens7.add(new Token(mode, TokenType.NULL, "("));
tokens7.add(new Token(mode, TokenType.COMMENT, "/* Knock-knock! */"));
tokens7.add(new Token(mode, TokenType.NULL, ")"));
tokens7.add(new Token(mode, TokenType.WHITESPACE, " "));
tokens7.add(new Token(mode, TokenType.NULL, "{"));
tokens7.add(new Token(mode, TokenType.NEWLINE, "\n"));
JsIndexUpdater indexUpdater = new JsIndexUpdater();
indexUpdater.onBeforeParse();
previousLine = TaggableLineUtil.getPreviousLine(line);
indexUpdater.onParseLine(previousLine, line, tokens1);
JsCodeScope aScope = line.getTag(JsIndexUpdater.TAG_SCOPE);
assertNotNull(aScope);
assertEquals("a", aScope.getName());
line = line.getNextLine();
previousLine = TaggableLineUtil.getPreviousLine(line);
indexUpdater.onParseLine(previousLine, line, tokens2);
JsCodeScope dProtoScope = line.getTag(JsIndexUpdater.TAG_SCOPE);
assertNotNull(dProtoScope);
assertEquals("d.prototype", dProtoScope.getName());
assertTrue(dProtoScope.getParent() == aScope);
assertEquals("a-d-prototype", JsCodeScope.buildPrefix(dProtoScope).join("-"));
line = line.getNextLine();
previousLine = TaggableLineUtil.getPreviousLine(line);
indexUpdater.onParseLine(previousLine, line, tokens3);
assertTrue(line.getTag(JsIndexUpdater.TAG_SCOPE) == aScope);
line = line.getNextLine();
previousLine = TaggableLineUtil.getPreviousLine(line);
indexUpdater.onParseLine(previousLine, line, tokens4);
assertFalse(line.getTag(JsIndexUpdater.TAG_SCOPE) == aScope);
line = line.getNextLine();
previousLine = TaggableLineUtil.getPreviousLine(line);
indexUpdater.onParseLine(previousLine, line, tokens5);
JsCodeScope eScope = line.getTag(JsIndexUpdater.TAG_SCOPE);
assertNotNull(eScope);
assertEquals("e", eScope.getName());
assertFalse(eScope.getParent() == aScope);
line = line.getNextLine();
previousLine = TaggableLineUtil.getPreviousLine(line);
indexUpdater.onParseLine(previousLine, line, tokens6);
JsCodeScope fScope = line.getTag(JsIndexUpdater.TAG_SCOPE);
assertNotNull(fScope);
assertEquals("f", fScope.getName());
assertTrue(fScope.getParent() == eScope);
line = line.getNextLine();
previousLine = TaggableLineUtil.getPreviousLine(line);
indexUpdater.onParseLine(previousLine, line, tokens7);
JsCodeScope namelessScope = line.getTag(JsIndexUpdater.TAG_SCOPE);
assertNotNull(namelessScope);
assertNull(namelessScope.getName());
assertTrue(namelessScope.getParent() == fScope);
indexUpdater.onAfterParse();
}
}