/**
* personium.io
* Copyright 2014 FUJITSU LIMITED
*
* 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.fujitsu.dc.test.unit.core.odata;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.odata4j.expression.ExpressionParser.TokenType;
import com.fujitsu.dc.core.odata.DcExpressionParser;
import com.fujitsu.dc.core.odata.DcExpressionParser.Token;
import com.fujitsu.dc.test.categories.Unit;
/**
* DcExpressionParser ユニットテストクラス.
*/
@Category({ Unit.class })
public class DcExpressionParserTest {
/**
* パース対象に括弧とじがない場合.
*/
@Test
public void パース対象の括弧始まりが1つ多い場合に括弧始まりが除去されること() {
List<Token> tokenList = new ArrayList<Token>();
Token t1 = new Token(TokenType.OPENPAREN, "(");
Token t2 = new Token(TokenType.OPENPAREN, "(");
Token t3 = new Token(TokenType.WORD, "test");
Token t4 = new Token(TokenType.CLOSEPAREN, ")");
tokenList.add(t1);
tokenList.add(t2);
tokenList.add(t3);
tokenList.add(t4);
List<Token> result = DcExpressionParser.processParentheses(tokenList);
assertEquals("[[(][test][)]]", result.toString());
}
/**
* パース対象に括弧とじがない場合に括弧始まりが除去されること_boolean.
*/
@Test
public void パース対象に括弧とじがない場合に括弧始まりが除去されること_boolean() {
List<Token> tokenList = new ArrayList<Token>();
Token t1 = new Token(TokenType.OPENPAREN, "(");
Token t2 = new Token(TokenType.OPENPAREN, "(");
Token t3 = new Token(TokenType.WORD, "true");
Token t4 = new Token(TokenType.CLOSEPAREN, ")");
tokenList.add(t1);
tokenList.add(t2);
tokenList.add(t3);
tokenList.add(t4);
List<Token> result = DcExpressionParser.processParentheses(tokenList);
assertEquals("[[(][true][)]]", result.toString());
}
/**
* メソッドanyの指定があるが次のTokenがSYMBOLではない場合エラーとなること.
*/
@Test
public void メソッドanyの指定があるが次のTokenがSYMBOLではない場合エラーとなること() {
List<Token> tokenList = new ArrayList<Token>();
Token t1 = new Token(TokenType.WORD, "/any");
Token t2 = new Token(TokenType.OPENPAREN, "(");
Token t3 = new Token(TokenType.WORD, "test");
Token t4 = new Token(TokenType.CLOSEPAREN, ")");
tokenList.add(t1);
tokenList.add(t2);
tokenList.add(t3);
tokenList.add(t4);
try {
DcExpressionParser.processParentheses(tokenList);
} catch (Exception e) {
assertEquals("expected ':', found: [)]", e.getMessage());
}
}
/**
* メソッドanyの指定があるがSYMBOLの指定がない場合エラーとなること.
*/
@Test
public void メソッドanyの指定があるがSYMBOLの指定がない場合エラーとなること() {
List<Token> tokenList = new ArrayList<Token>();
Token t1 = new Token(TokenType.WORD, "/any");
Token t2 = new Token(TokenType.OPENPAREN, "(");
Token t3 = new Token(TokenType.WORD, "test");
tokenList.add(t1);
tokenList.add(t2);
tokenList.add(t3);
try {
DcExpressionParser.processParentheses(tokenList);
} catch (Exception e) {
assertEquals("expected ':', found: eof", e.getMessage());
}
}
/**
* メソッドの指定があるがWORDの指定がない場合エラーとなること.
*/
@Test
public void メソッドの指定があるがWORDの指定がない場合エラーとなること() {
List<Token> tokenList = new ArrayList<Token>();
Token t1 = new Token(TokenType.WORD, "/any");
Token t2 = new Token(TokenType.OPENPAREN, "(");
tokenList.add(t1);
tokenList.add(t2);
try {
DcExpressionParser.processParentheses(tokenList);
} catch (Exception e) {
assertEquals("unexpected token: eof", e.getMessage());
}
}
/**
* メソッドanyの次がWORDその次がSYMBOLのときエラーにならないこと.
*/
@Test
public void メソッドanyの次がWORDその次がSYMBOLのときエラーにならないこと() {
List<Token> tokenList = new ArrayList<Token>();
Token t1 = new Token(TokenType.WORD, "/any");
Token t2 = new Token(TokenType.OPENPAREN, "(");
Token t3 = new Token(TokenType.WORD, "test");
Token t4 = new Token(TokenType.SYMBOL, ":");
tokenList.add(t1);
tokenList.add(t2);
tokenList.add(t3);
tokenList.add(t4);
List<Token> result = DcExpressionParser.processParentheses(tokenList);
assertEquals("[[/any], [test], [:]]", result.toString());
}
/**
* anyとascを同時に指定した場合にエラーとなること.
*/
@Test
public void anyとascを同時に指定した場合にエラーとなること() {
List<Token> tokenList = new ArrayList<Token>();
Token t1 = new Token(TokenType.WORD, "/any");
Token t2 = new Token(TokenType.OPENPAREN, "(");
Token t3 = new Token(TokenType.WORD, "test");
Token t4 = new Token(TokenType.SYMBOL, ":");
Token t5 = new Token(TokenType.WORD, "test");
Token t6 = new Token(TokenType.WORD, "asc");
Token t7 = new Token(TokenType.CLOSEPAREN, ")");
tokenList.add(t1);
tokenList.add(t2);
tokenList.add(t3);
tokenList.add(t4);
tokenList.add(t5);
tokenList.add(t6);
tokenList.add(t7);
try {
DcExpressionParser.processParentheses(tokenList);
} catch (Exception e) {
assertEquals("illegal any predicate", e.getMessage());
}
}
/**
* メソッドanyの括弧の中身が空のときにエラーとならないこと.
*/
@Test
public void メソッドanyの括弧の中身が空のときにエラーとならないこと() {
List<Token> tokenList = new ArrayList<Token>();
Token t1 = new Token(TokenType.WORD, "/any");
Token t2 = new Token(TokenType.OPENPAREN, "(");
Token t3 = new Token(TokenType.CLOSEPAREN, ")");
tokenList.add(t1);
tokenList.add(t2);
tokenList.add(t3);
List<Token> result = DcExpressionParser.processParentheses(tokenList);
assertEquals("[[/any][(][)]]", result.toString());
}
/**
* メソッドallの次がWORDその次がSYMBOLのときエラーにならないこと.
*/
@Test
public void メソッドallの次がWORDその次がSYMBOLのときエラーにならないこと() {
List<Token> tokenList = new ArrayList<Token>();
Token t1 = new Token(TokenType.WORD, "/all");
Token t2 = new Token(TokenType.OPENPAREN, "(");
Token t3 = new Token(TokenType.WORD, "test");
Token t4 = new Token(TokenType.SYMBOL, ":");
tokenList.add(t1);
tokenList.add(t2);
tokenList.add(t3);
tokenList.add(t4);
List<Token> result = DcExpressionParser.processParentheses(tokenList);
assertEquals("[[/all], [test], [:]]", result.toString());
}
}