// 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 static com.google.collide.codemirror2.TokenType.NULL; import static com.google.collide.codemirror2.TokenType.VARIABLE; import static com.google.collide.codemirror2.TokenType.WHITESPACE; import com.google.collide.client.code.autocomplete.TestUtils; import com.google.collide.client.documentparser.ParseResult; import com.google.collide.client.testutil.SynchronousTestCase; import com.google.collide.codemirror2.State; import com.google.collide.codemirror2.Token; import com.google.collide.codemirror2.TokenType; import com.google.collide.json.shared.JsonArray; import com.google.collide.shared.util.JsonCollections; import com.google.gwt.regexp.shared.MatchResult; import com.google.gwt.regexp.shared.RegExp; import javax.annotation.Nullable; /** * Test cases for {@link ProposalBuilder}. * */ public class ProposalBuilderTest extends SynchronousTestCase { private static final RegExp PARSER = RegExp.compile("^(([A-Za-z]+)|([(+).])|(\\s+))"); @Override public String getModuleName() { return "com.google.collide.client.TestCode"; } public void testTriggeringString() { checkContext("empty", "", null, ""); checkContext("simple", "foo", null, "foo"); checkContext("spaceless expression", "bar", null, "foo+bar"); checkContext("expression", "bar", null, " + bar"); checkContext("period, space, id", "get", null, ". get"); checkContext("property", "get", null, "foo.get"); checkContext("empty property", "", "foo.", "foo."); checkContext("empty cascade-property", "", "foo.foo.", "foo.foo."); } private void checkContext(String message, String triggeringString, @Nullable String prevContext, String text) { ProposalBuilder<State> proposalBuilder = new CodeGraphAutocompleterTest.MockProposalBuilder(); CompletionContext<State> context = proposalBuilder.buildContext(parse(text)); assertEquals( message + ": triggering string", triggeringString, context.getTriggeringString()); if (prevContext != null) { assertEquals( message + ": previous context", prevContext, context.getPreviousContext()); } } private ParseUtils.ExtendedParseResult<State> parse(String text) { JsonArray<Token> tokens = JsonCollections.createArray(); while (text.length() > 0) { MatchResult result = PARSER.exec(text); if (result == null) { throw new IllegalArgumentException("Can't parse: " + text); } String value; TokenType type; if (result.getGroup(2) != null) { value = result.getGroup(2); type = VARIABLE; } else if (result.getGroup(3) != null) { value = result.getGroup(3); type = NULL; } else if (result.getGroup(4) != null) { value = result.getGroup(4); type = WHITESPACE; } else { throw new IllegalArgumentException("Can't parse: " + result.getGroup(1)); } tokens.add(new Token("test", type, value)); text = text.substring(value.length()); } ParseResult<State> parseResult = new ParseResult<State>(tokens, TestUtils.createMockState()); return new ParseUtils.ExtendedParseResult<State>(parseResult, ParseUtils.Context.IN_CODE); } public void testPreviousContextTrimming() { String text = " goog.le "; checkContext("before property", "", "goog.", text.substring(0, 8)); checkContext("after property", "le", "goog.", text.substring(0, 10)); checkContext("after property and space", "", "", text.substring(0, 11)); } public void testStripFunctionCallBraces() { checkContext("brace", "", "", "getFoo()"); checkContext("braces and period", "", "getFoo.", "getFoo()."); checkContext("id in braces and period", "", "getFoo.", "getFoo(bar)."); checkContext("braces, period, id", "getBar", "getFoo.", "getFoo().getBar"); checkContext("new in braces, period", "", ".", "(new Foo())."); } }