/hazelcast/src/test/java/com/hazelcast/query/ParserTest.java

https://bitbucket.org/gabral6_gmailcom/hazelcast · Java · 170 lines · 130 code · 25 blank · 15 comment · 2 complexity · 323ea2fe45d8a4cd7511c7eed4736e9d MD5 · raw file

  1. /*
  2. * Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.hazelcast.query;
  17. import org.junit.Test;
  18. import org.junit.runner.RunWith;
  19. import java.security.SecureRandom;
  20. import java.util.Arrays;
  21. import java.util.List;
  22. import java.util.Random;
  23. import static junit.framework.Assert.*;
  24. @RunWith(com.hazelcast.util.RandomBlockJUnit4ClassRunner.class)
  25. public class ParserTest {
  26. Parser parser = new Parser();
  27. @Test
  28. public void parseEmpty() {
  29. List<String> l = parser.toPrefix("");
  30. assertEquals(Arrays.asList(), l);
  31. }
  32. @Test
  33. public void parseAEqB() {
  34. String s = "a = b";
  35. List<String> list = parser.toPrefix(s);
  36. assertEquals(Arrays.asList("a", "b", "="), list);
  37. }
  38. @Test
  39. public void parseAeqBandXgrtY() {
  40. assertTrue(parser.hasHigherPrecedence("=", "AND"));
  41. assertFalse(parser.hasHigherPrecedence("=", ">"));
  42. List<String> list = parser.toPrefix("a = b AND x > y");
  43. assertEquals(Arrays.asList("a", "b", "=", "x", "y", ">", "AND"), list);
  44. }
  45. @Test
  46. public void parseAeqBandOpenBsmlCorDgtEclose() {
  47. String s = "A = B AND ( B < C OR D > E )";
  48. List<String> list = parser.toPrefix(s);
  49. assertEquals(Arrays.asList("A", "B", "=", "B", "C", "<", "D", "E", ">", "OR", "AND"), list);
  50. }
  51. @Test
  52. public void testComplexStatement() {
  53. String s = "age > 5 AND ( ( ( active = true ) AND ( age = 23 ) ) OR age > 40 ) AND ( salary > 10 ) OR age = 10";
  54. List<String> list = parser.toPrefix(s);
  55. assertEquals(Arrays.asList("age", "5", ">", "active", "true", "=", "age", "23", "=", "AND", "age", "40", ">", "OR", "AND", "salary", "10", ">", "AND", "age", "10", "=", "OR"), list);
  56. }
  57. @Test
  58. public void testTwoInnerParanthesis() {
  59. String s = "a and b AND ( ( ( a > c AND b > d ) OR ( x = y ) ) ) OR t > u";
  60. List<String> list = parser.toPrefix(s);
  61. assertEquals(Arrays.asList("a", "b", "and", "a", "c", ">", "b", "d", ">", "AND", "x", "y", "=", "OR", "AND", "t", "u", ">", "OR"), list);
  62. }
  63. @Test
  64. public void testBetweenAnd() {
  65. String s = "a and b between 10 and 15";
  66. List<String> list = parser.toPrefix(s);
  67. assertEquals(Arrays.asList("a", "b", "10", "15", "between", "and"), list);
  68. }
  69. @Test
  70. public void testBetween() {
  71. String s = "b between 10 and 15";
  72. List<String> list = parser.toPrefix(s);
  73. assertEquals(Arrays.asList("b", "10", "15", "between"), list);
  74. }
  75. @Test
  76. public void testIn() {
  77. String s = "a and b OR c in ( 4, 5, 6 )";
  78. List<String> list = parser.toPrefix(s);
  79. assertEquals(Arrays.asList("a", "b", "and", "c", "4,5,6", "in", "OR"), list);
  80. }
  81. @Test
  82. public void testNot() {
  83. String s = "a and not(b) OR c not in ( 4, 5, 6 )";
  84. List<String> list = parser.toPrefix(s);
  85. assertEquals(Arrays.asList("a", "b", "not", "and", "c", "4,5,6", "in", "not", "OR"), list);
  86. }
  87. @Test
  88. public void testNotEqual() {
  89. String s = "b != 30";
  90. List<String> list = parser.toPrefix(s);
  91. assertEquals(Arrays.asList("b", "30", "!="), list);
  92. }
  93. @Test
  94. public void split1() {
  95. List<String> tokens = parser.split("a and b");
  96. assertEquals(Arrays.asList("a", "and", "b"), tokens);
  97. }
  98. @Test
  99. public void split2() {
  100. List<String> tokens = parser.split("(a and b)");
  101. assertEquals(Arrays.asList("(", "a", "and", "b", ")"), tokens);
  102. }
  103. @Test
  104. public void split3() {
  105. List<String> tokens = parser.split("((a and b))");
  106. assertEquals(Arrays.asList("(", "(", "a", "and", "b", ")", ")"), tokens);
  107. }
  108. @Test
  109. public void split4() {
  110. List<String> tokens = parser.split("a and b AND(((a>c AND b> d) OR (x = y )) ) OR t>u");
  111. assertEquals(Arrays.asList("a", "and", "b", "AND", "(", "(", "(", "a", ">", "c", "AND", "b", ">", "d", ")", "OR", "(", "x", "=", "y", ")", ")", ")", "OR", "t", ">", "u"), tokens);
  112. }
  113. @Test
  114. public void split5() {
  115. List<String> tokens = parser.split("a and b AND(((a>=c AND b> d) OR (x <> y )) ) OR t>u");
  116. assertEquals(Arrays.asList("a", "and", "b", "AND", "(", "(", "(", "a", ">=", "c", "AND", "b", ">", "d", ")", "OR", "(", "x", "<>", "y", ")", ")", ")", "OR", "t", ">", "u"), tokens);
  117. }
  118. @Test
  119. public void testComplexStatementWithGreaterAndEqueals() {
  120. String s = "age>=5 AND ((( active = true ) AND (age = 23 )) OR age > 40) AND( salary>10 ) OR age=10";
  121. List<String> list = parser.toPrefix(s);
  122. assertEquals(Arrays.asList("age", "5", ">=", "active", "true", "=", "age", "23", "=", "AND", "age", "40", ">", "OR", "AND", "salary", "10", ">", "AND", "age", "10", "=", "OR"), list);
  123. }
  124. @Test(expected = NullPointerException.class)
  125. public void parserShouldNotAcceptNull() {
  126. parser.toPrefix(null);
  127. fail();
  128. }
  129. @Test
  130. public void parserShouldThrowOnInvalidInput() {
  131. parser.toPrefix(")");
  132. }
  133. @Test
  134. public void shouldNotThrowOnRandomInput() {
  135. Random random = new SecureRandom();
  136. StringBuilder stringBuilder = new StringBuilder();
  137. for (int i = 0; i < 1000; i++) {
  138. stringBuilder.setLength(0);
  139. for (int n = 0; n < 1000; n++) {
  140. stringBuilder.append((char) (random.nextInt() & 0xFFFF));
  141. }
  142. parser.toPrefix(stringBuilder.toString());
  143. }
  144. }
  145. }