1 | // Copyright (C) 2010 Google Inc. |
2 | // |
3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
4 | // you may not use this file except in compliance with the License. |
5 | // You may obtain a copy of the License at |
6 | // |
7 | // http://www.apache.org/licenses/LICENSE-2.0 |
8 | // |
9 | // Unless required by applicable law or agreed to in writing, software |
10 | // distributed under the License is distributed on an "AS IS" BASIS, |
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | // See the License for the specific language governing permissions and |
13 | // limitations under the License. |
14 | |
15 | package com.google.caja.lang.css; |
16 | |
17 | import junit.framework.TestCase; |
18 | import static com.google.caja.lang.css.JSRE.alt; |
19 | import static com.google.caja.lang.css.JSRE.any; |
20 | import static com.google.caja.lang.css.JSRE.cat; |
21 | import static com.google.caja.lang.css.JSRE.lit; |
22 | import static com.google.caja.lang.css.JSRE.many; |
23 | import static com.google.caja.lang.css.JSRE.opt; |
24 | import static com.google.caja.lang.css.JSRE.raw; |
25 | import static com.google.caja.lang.css.JSRE.rep; |
26 | |
27 | public class JSRETest extends TestCase { |
28 | public final void testOptimize() { |
29 | assertOptimized("foo", lit("foo")); |
30 | assertOptimized("foo", raw("foo")); |
31 | assertEquals("(?:fo)(?:o)*", "" + cat(lit("fo"), any(lit("o")))); |
32 | assertOptimized("fo+", cat(lit("fo"), any(lit("o")))); |
33 | assertOptimized("bar\\\\baz", lit("bar\\baz")); |
34 | assertOptimized("bar\\baz", raw("bar\\baz")); |
35 | assertOptimized("foo|bar", alt(lit("foo"), lit("bar"))); |
36 | assertOptimized("b(?:a|ee)r", alt(lit("bar"), lit("beer"))); |
37 | assertOptimized("be[ae]r", alt(lit("bear"), lit("beer"))); |
38 | assertOptimized( |
39 | "a[+\\-\\n]b", |
40 | alt(lit("a+b"), lit("a-b"), cat(raw("a"), raw("\\n"), raw("b")))); |
41 | assertOptimized("barn?", alt(lit("bar"), lit("barn"))); |
42 | assertOptimized("b?ear", alt(lit("bear"), lit("ear"))); |
43 | assertOptimized("", alt(cat(), lit(""), raw(""))); |
44 | assertOptimized("(?:foo)?", opt(lit("foo"))); |
45 | assertOptimized("(?:foo)+", many(lit("foo"))); |
46 | assertOptimized("(?:foo)*", any(lit("foo"))); |
47 | JSRE x = lit("x"); |
48 | assertOptimized("x?", opt(opt(x))); |
49 | assertOptimized("x*", many(opt(x))); |
50 | assertOptimized("x*", any(opt(x))); |
51 | assertOptimized("x*", rep(opt(x), 2, Integer.MAX_VALUE)); |
52 | assertOptimized("x{0,4}", rep(opt(x), 2, 4)); |
53 | assertOptimized("x*", opt(any(x))); |
54 | assertOptimized("x*", any(any(x))); |
55 | assertOptimized("x*", many(any(x))); |
56 | assertOptimized("x*", rep(any(x), 2, 3)); |
57 | assertOptimized("x*", opt(many(x))); |
58 | assertOptimized("x*", any(many(x))); |
59 | assertOptimized("x+", many(many(x))); |
60 | assertOptimized("x{2,}", rep(many(x), 2, 4)); |
61 | assertOptimized("(?:x{2,4})*", any(rep(x, 2, 4))); |
62 | assertOptimized("(?:x{2,4})+", many(rep(x, 2, 4))); |
63 | assertOptimized("(?:x{2,4})?", opt(rep(x, 2, 4))); |
64 | assertOptimized("(?:x{2,4}){1,3}", rep(rep(x, 2, 4), 1, 3)); |
65 | assertOptimized("x{2,}", rep(x, 2, Integer.MAX_VALUE)); |
66 | assertOptimized("x{0,4}", rep(x, 0, 4)); |
67 | assertEquals("(?:foo)(?:foo)*", "" + cat(lit("foo"), any(lit("foo")))); |
68 | assertOptimized("(?:foo)+", cat(lit("foo"), any(lit("foo")))); |
69 | assertOptimized("(?:foo)+", cat(any(lit("foo")), lit("foo"))); |
70 | assertOptimized("foo|ba[rz]", alt(lit("foo"), alt(lit("bar"), lit("baz")))); |
71 | assertOptimized("foo|bar|ak", alt(lit("foo"), alt(lit("bar"), lit("ak")))); |
72 | assertOptimized("[xy]", alt(x, x, x, lit("y"), x)); |
73 | JSRE noop = lit(""); |
74 | assertOptimized("[xy]?", alt(x, noop, x, lit("y"), x, noop)); |
75 | assertOptimized("a(?:bac){1,2}", alt(lit("abacbac"), lit("abac"))); |
76 | assertOptimized("a(?:bac){1,2}", alt(lit("abac"), lit("abacbac"))); |
77 | assertOptimized("ab", cat(lit("a"), noop, lit("b"))); |
78 | assertOptimized("foo", rep(lit("foo"), 1, 1)); |
79 | assertOptimized("", opt(noop)); |
80 | assertOptimized("", many(noop)); |
81 | assertOptimized("x*(?:foo)?", cat(any(x), opt(cat(any(x), lit("foo"))))); |
82 | assertOptimized("[ab]", alt(lit("a"), lit("b"))); |
83 | assertOptimized("[ab]", alt(lit("b"), lit("a"))); |
84 | assertOptimized("[a-c]", alt(lit("a"), lit("b"), lit("c"))); |
85 | assertOptimized( |
86 | "[BCa-c]", alt(lit("b"), lit("C"), lit("a"), lit("B"), lit("c"))); |
87 | assertOptimized( |
88 | "[ACa-c]", alt(lit("b"), lit("A"), lit("a"), lit("C"), lit("c"))); |
89 | } |
90 | |
91 | private static void assertOptimized(String regex, JSRE p) { |
92 | assertEquals(p, p); |
93 | JSRE optimized = p.optimize(); |
94 | assertEquals(optimized, optimized); |
95 | assertEquals(regex, "" + optimized); |
96 | } |
97 | } |