/*
* RTokenizerTests.java
*
* Copyright (C) 2009-17 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.studio.client.common.r;
import junit.framework.Assert;
import com.google.gwt.junit.client.GWTTestCase;
import org.rstudio.studio.client.common.r.RToken;
import org.rstudio.studio.client.common.r.RTokenizer;
public class RTokenizerTests extends GWTTestCase
{
@Override
public String getModuleName()
{
return "org.rstudio.studio.RStudioTests";
}
public void testVoid()
{
RTokenizer rt = new RTokenizer("") ;
Assert.assertNull(rt.nextToken()) ;
}
public void testSimple()
{
Verifier v = new Verifier(RToken.ERROR, " ", " ") ;
v.verify(RToken.LPAREN, "(") ;
v.verify(RToken.RPAREN, ")") ;
v.verify(RToken.LBRACKET, "[") ;
v.verify(RToken.RBRACKET, "]") ;
v.verify(RToken.LBRACE, "{") ;
v.verify(RToken.RBRACE, "}") ;
v.verify(RToken.COMMA, ",") ;
v.verify(RToken.SEMI, ";") ;
}
public void testError()
{
}
public void testComment()
{
Verifier v = new Verifier(RToken.COMMENT, " ", "\n") ;
v.verify("#");
v.verify("# foo #");
Verifier v2 = new Verifier(RToken.COMMENT, " ", "\r\n") ;
v2.verify("#");
v2.verify("# foo #");
}
public void testNumbers()
{
Verifier v = new Verifier(RToken.NUMBER, " ", " ") ;
v.verify(new String[] {
"1", "10", "0.1", ".2", "1e-7", "1.2e+7", "2e", "3e+",
"0x", "0x0", "0xDEADBEEF", "0xcafebad", "1L", "0x10L",
"1000000L", "1e6L", "1.1L", "1e-3L", "2i", "4.1i",
"1e-2i"
}) ;
}
public void testOperators()
{
Verifier v = new Verifier(RToken.OPER, " ", " ") ;
v.verify(
"+ - * / ^ > >= < <= == != ! & | ~ -> <- $ : =".split(" ")) ;
}
public void testUOperators()
{
Verifier v = new Verifier(RToken.UOPER, " ", " ") ;
v.verify(new String[] {
"%%", "%test test%"
}) ;
}
public void testStrings()
{
Verifier v = new Verifier(RToken.STRING, " ", " ") ;
v.verify("\"test\"") ;
v.verify("\" '$\t\r\n\\\"\"") ;
v.verify("\"\"") ;
v.verify("''") ;
v.verify("'\"'") ;
v.verify("'\\\"'") ;
v.verify("'\n'") ;
v.verify("'foo bar \\U654'") ;
}
public void testIdentifiers()
{
Verifier v = new Verifier(RToken.ID, " ", " ") ;
v.verify(new String[] {
".", "...", "..1", "..2", "foo", "FOO", "f1",
"a_b", "ab_", "\u00C1qc1", "`foo`", "`$@!$@#$`", "`a\n\"'b`"
}) ;
}
public void testWhitespace()
{
Verifier v = new Verifier(RToken.WHITESPACE, "a", "z") ;
v.verify("\u00A0") ;
v.verify(new String[] {
" ", " ", "\u00A0", "\t\n"
}) ;
}
protected void verify(String data,
int tokenType,
String content)
{
RTokenizer rt = new RTokenizer(data) ;
RToken token = rt.nextToken() ;
Assert.assertNotNull(token) ;
Assert.assertEquals(tokenType, token.getTokenType()) ;
Assert.assertEquals(0, token.getOffset()) ;
Assert.assertEquals(content.length(), token.getLength()) ;
Assert.assertEquals(content, token.getContent()) ;
}
class Verifier
{
private final int defaultTokenType ;
private final String prefix ;
private final String suffix ;
public Verifier(int defaultTokenType, String prefix, String suffix)
{
super() ;
this.defaultTokenType = defaultTokenType ;
this.prefix = prefix ;
this.suffix = suffix ;
}
public void verify(String value)
{
verify(defaultTokenType, value) ;
}
public void verify(int tokenType, String value)
{
RTokenizer rt = new RTokenizer(prefix + value + suffix) ;
RToken t ;
while (null != (t = rt.nextToken()))
{
if (t.getOffset() == prefix.length())
{
Assert.assertEquals(tokenType, t.getTokenType()) ;
Assert.assertEquals(value.length(), t.getLength()) ;
Assert.assertEquals(value, t.getContent()) ;
return ;
}
}
Assert.fail("Bad prefix?") ;
}
public void verify(String[] values)
{
verify(defaultTokenType, values) ;
}
public void verify(int tokenType, String[] values)
{
for (String value : values)
verify(tokenType, value) ;
}
}
}