Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Side by Side Diff: Source/core/css/MediaQuerySetTest.cpp

Issue 221693004: Unit test both MQ parsers. Fix MQ parser block handling bugs (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fixed nit Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | Source/core/css/parser/MediaQueryParser.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/css/MediaQuery.h" 6 #include "core/css/MediaQuery.h"
7 7
8 #include "core/css/MediaList.h" 8 #include "core/css/MediaList.h"
9 #include "wtf/PassOwnPtr.h" 9 #include "wtf/PassOwnPtr.h"
10 #include "wtf/text/StringBuilder.h" 10 #include "wtf/text/StringBuilder.h"
11 11
12 #include <gtest/gtest.h> 12 #include <gtest/gtest.h>
13 13
14 namespace WebCore { 14 namespace WebCore {
15 15
16 typedef struct { 16 typedef struct {
17 const char* input; 17 const char* input;
18 const char* output; 18 const char* output;
19 bool shouldWorkOnOldParser;
19 } TestCase; 20 } TestCase;
20 21
22 static void testMediaQuery(TestCase test, MediaQuerySet& querySet, bool oldParse r)
23 {
24 StringBuilder output;
25 size_t j = 0;
26 while (j < querySet.queryVector().size()) {
27 String queryText = querySet.queryVector()[j]->cssText();
28 output.append(queryText);
29 ++j;
30 if (j >= querySet.queryVector().size())
31 break;
32 output.append(", ");
33 }
34 if (!oldParser || test.shouldWorkOnOldParser) {
35 if (test.output)
36 ASSERT_STREQ(test.output, output.toString().ascii().data());
37 else
38 ASSERT_STREQ(test.input, output.toString().ascii().data());
39 }
40 }
41
21 TEST(MediaQueryParserTest, Basic) 42 TEST(MediaQueryParserTest, Basic)
22 { 43 {
23 // The first string represents the input string. 44 // The first string represents the input string.
24 // The second string represents the output string, if present. 45 // The second string represents the output string, if present.
25 // Otherwise, the output string is identical to the first string. 46 // Otherwise, the output string is identical to the first string.
26 TestCase testCases[] = { 47 TestCase testCases[] = {
27 {"screen", 0}, 48 {"screen", 0, true},
28 {"screen and (color)", 0}, 49 {"screen and (color)", 0, true},
29 {"all and (min-width:500px)", "(min-width: 500px)"}, 50 {"all and (min-width:500px)", "(min-width: 500px)", true},
30 {"all and (min-width:/*bla*/500px)", "(min-width: 500px)"}, 51 {"all and (min-width:/*bla*/500px)", "(min-width: 500px)", true},
31 {"(min-width:500px)", "(min-width: 500px)"}, 52 {"(min-width:500px)", "(min-width: 500px)", true},
32 {"screen and (color), projection and (color)", 0}, 53 {"screen and (color), projection and (color)", 0, true},
33 {"not screen and (color)", 0}, 54 {"not screen and (color)", 0, true},
34 {"only screen and (color)", 0}, 55 {"only screen and (color)", 0, true},
35 {"screen and (color), projection and (color)", 0}, 56 {"screen and (color), projection and (color)", 0, true},
36 {"aural and (device-aspect-ratio: 16/9)", 0}, 57 {"aural and (device-aspect-ratio: 16/9)", 0, true},
37 {"speech and (min-device-width: 800px)", 0}, 58 {"speech and (min-device-width: 800px)", 0, true},
38 {"example", 0}, 59 {"example", 0, true},
39 {"screen and (max-weight: 3kg) and (color), (monochrome)", "not all, (mo nochrome)"}, 60 {"screen and (max-weight: 3kg) and (color), (monochrome)", "not all, (mo nochrome)", true},
40 {"(min-width: -100px)", "not all"}, 61 {"(min-width: -100px)", "not all", true},
41 {"(example, all,), speech", "not all, speech"}, 62 {"(example, all,), speech", "not all, speech", true},
42 {"&test, screen", "not all, screen"}, 63 {"&test, screen", "not all, screen", true},
43 {"print and (min-width: 25cm)", 0}, 64 {"print and (min-width: 25cm)", 0, true},
44 {"screen and (min-width: 400px) and (max-width: 700px)", "screen and (ma x-width: 700px) and (min-width: 400px)"}, 65 {"screen and (min-width: 400px) and (max-width: 700px)", "screen and (ma x-width: 700px) and (min-width: 400px)", true},
45 {"screen and (device-width: 800px)", 0}, 66 {"screen and (device-width: 800px)", 0, true},
46 {"screen and (device-height: 60em)", 0}, 67 {"screen and (device-height: 60em)", 0, true},
47 {"screen and (device-aspect-ratio: 16/9)", 0}, 68 {"screen and (device-aspect-ratio: 16/9)", 0, true},
48 {"(device-aspect-ratio: 16.0/9.0)", "not all"}, 69 {"(device-aspect-ratio: 16.0/9.0)", "not all", true},
49 {"(device-aspect-ratio: 16/ 9)", "(device-aspect-ratio: 16/9)"}, 70 {"(device-aspect-ratio: 16/ 9)", "(device-aspect-ratio: 16/9)", true},
50 {"(device-aspect-ratio: 16/\r9)", "(device-aspect-ratio: 16/9)"}, 71 {"(device-aspect-ratio: 16/\r9)", "(device-aspect-ratio: 16/9)", true},
51 {"all and (color)", "(color)"}, 72 {"all and (color)", "(color)", true},
52 {"all and (min-color: 1)", "(min-color: 1)"}, 73 {"all and (min-color: 1)", "(min-color: 1)", true},
53 {"all and (min-color: 1.0)", "not all"}, 74 {"all and (min-color: 1.0)", "not all", true},
54 {"all and (min-color: 2)", "(min-color: 2)"}, 75 {"all and (min-color: 2)", "(min-color: 2)", true},
55 {"all and (color-index)", "(color-index)"}, 76 {"all and (color-index)", "(color-index)", true},
56 {"all and (min-color-index: 1)", "(min-color-index: 1)"}, 77 {"all and (min-color-index: 1)", "(min-color-index: 1)", true},
57 {"all and (monochrome)", "(monochrome)"}, 78 {"all and (monochrome)", "(monochrome)", true},
58 {"all and (min-monochrome: 1)", "(min-monochrome: 1)"}, 79 {"all and (min-monochrome: 1)", "(min-monochrome: 1)", true},
59 {"all and (min-monochrome: 2)", "(min-monochrome: 2)"}, 80 {"all and (min-monochrome: 2)", "(min-monochrome: 2)", true},
60 {"print and (monochrome)", 0}, 81 {"print and (monochrome)", 0, true},
61 {"handheld and (grid) and (max-width: 15em)", 0}, 82 {"handheld and (grid) and (max-width: 15em)", 0, true},
62 {"handheld and (grid) and (max-device-height: 7em)", 0}, 83 {"handheld and (grid) and (max-device-height: 7em)", 0, true},
63 {"screen and (max-width: 50%)", "not all"}, 84 {"screen and (max-width: 50%)", "not all", true},
64 {"screen and (max-WIDTH: 500px)", "screen and (max-width: 500px)"}, 85 {"screen and (max-WIDTH: 500px)", "screen and (max-width: 500px)", true} ,
65 {"screen and (max-width: 24.4em)", 0}, 86 {"screen and (max-width: 24.4em)", 0, true},
66 {"screen and (max-width: 24.4EM)", "screen and (max-width: 24.4em)"}, 87 {"screen and (max-width: 24.4EM)", "screen and (max-width: 24.4em)", tru e},
67 {"screen and (max-width: blabla)", "not all"}, 88 {"screen and (max-width: blabla)", "not all", true},
68 {"screen and (max-width: 1)", "not all"}, 89 {"screen and (max-width: 1)", "not all", true},
69 {"screen and (max-width: 0)", 0}, 90 {"screen and (max-width: 0)", 0, true},
70 {"screen and (max-width: 1deg)", "not all"}, 91 {"screen and (max-width: 1deg)", "not all", true},
71 {"handheld and (min-width: 20em), \nscreen and (min-width: 20em)", "hand held and (min-width: 20em), screen and (min-width: 20em)"}, 92 {"handheld and (min-width: 20em), \nscreen and (min-width: 20em)", "hand held and (min-width: 20em), screen and (min-width: 20em)", true},
72 {"print and (min-resolution: 300dpi)", 0}, 93 {"print and (min-resolution: 300dpi)", 0, true},
73 {"print and (min-resolution: 118dpcm)", 0}, 94 {"print and (min-resolution: 118dpcm)", 0, true},
74 {"(resolution: 0.83333333333333333333dppx)", "(resolution: 0.83333333333 33334dppx)"}, 95 {"(resolution: 0.83333333333333333333dppx)", "(resolution: 0.83333333333 33334dppx)", true},
75 {"(resolution: 2.4dppx)", 0}, 96 {"(resolution: 2.4dppx)", 0, true},
76 {"all and(color)", "not all"}, 97 {"all and(color)", "not all", true},
77 {"all and (", "not all"}, 98 {"all and (", "not all", true},
78 {"test;,all", "not all, all"}, 99 {"test;,all", "not all, all", true},
79 // {"(color:20example)", "not all"}, 100 {"(color:20example)", "not all", false},
80 {"not braille", 0}, 101 {"not braille", 0, true},
81 {",screen", "not all, screen"}, 102 {",screen", "not all, screen", true},
82 {",all", "not all, all"}, 103 {",all", "not all, all", true},
83 {",,all,,", "not all, not all, all, not all, not all"}, 104 {",,all,,", "not all, not all, all, not all, not all", true},
84 {",,all,, ", "not all, not all, all, not all, not all"}, 105 {",,all,, ", "not all, not all, all, not all, not all", true},
85 {",screen,,&invalid,,", "not all, screen, not all, not all, not all, not all"}, 106 {",screen,,&invalid,,", "not all, screen, not all, not all, not all, not all", true},
86 {",screen,,(invalid,),,", "not all, screen, not all, not all, not all, n ot all"}, 107 {",screen,,(invalid,),,", "not all, screen, not all, not all, not all, n ot all", true},
87 {",(all,),,", "not all, not all, not all, not all"}, 108 {",(all,),,", "not all, not all, not all, not all", true},
88 {",", "not all, not all"}, 109 {",", "not all, not all", true},
89 {" ", ""}, 110 {" ", "", true},
90 {"(color", "(color)"}, 111 {"(color", "(color)", true},
91 {"(min-color: 2", "(min-color: 2)"}, 112 {"(min-color: 2", "(min-color: 2)", true},
92 {"(orientation: portrait)", 0}, 113 {"(orientation: portrait)", 0, true},
93 {"tv and (scan: progressive)", 0}, 114 {"tv and (scan: progressive)", 0, true},
94 {"(pointer: coarse)", 0}, 115 {"(pointer: coarse)", 0, true},
95 {"(min-orientation:portrait)", "not all"}, 116 {"(min-orientation:portrait)", "not all", true},
96 {"all and (orientation:portrait)", "(orientation: portrait)"}, 117 {"all and (orientation:portrait)", "(orientation: portrait)", true},
97 {"all and (orientation:landscape)", "(orientation: landscape)"}, 118 {"all and (orientation:landscape)", "(orientation: landscape)", true},
98 {"NOT braille, tv AND (max-width: 200px) and (min-WIDTH: 100px) and (ori entation: landscape), (color)", 119 {"NOT braille, tv AND (max-width: 200px) and (min-WIDTH: 100px) and (ori entation: landscape), (color)",
99 "not braille, tv and (max-width: 200px) and (min-width: 100px) and ( orientation: landscape), (color)"}, 120 "not braille, tv and (max-width: 200px) and (min-width: 100px) and ( orientation: landscape), (color)", true},
100 {"(max-width: 700px), (max-width: 700px)", "(max-width: 700px), (max-wid th: 700px)"}, 121 {"(max-width: 700px), (max-width: 700px)", "(max-width: 700px), (max-wid th: 700px)", true},
101 {"(max-width: 800px()), (max-width: 800px)", "not all, (max-width: 800px )"}, 122 {"(max-width: 800px()), (max-width: 800px)", "not all, (max-width: 800px )", true},
102 {"(max-width: 900px(()), (max-width: 900px)", "not all"}, 123 {"(max-width: 900px(()), (max-width: 900px)", "not all", true},
103 {"(max-width: 600px(())))), (max-width: 600px)", "not all, (max-width: 6 00px)"}, 124 {"(max-width: 600px(())))), (max-width: 600px)", "not all, (max-width: 6 00px)", true},
104 {"(max-width: 500px(((((((((())))), (max-width: 500px)", "not all"}, 125 {"(max-width: 500px(((((((((())))), (max-width: 500px)", "not all", true },
105 {"(max-width: 800px[]), (max-width: 800px)", "not all, (max-width: 800px )"}, 126 {"(max-width: 800px[]), (max-width: 800px)", "not all, (max-width: 800px )", true},
106 {"(max-width: 900px[[]), (max-width: 900px)", "not all"}, 127 {"(max-width: 900px[[]), (max-width: 900px)", "not all", true},
107 {"(max-width: 600px[[]]]]), (max-width: 600px)", "not all, (max-width: 6 00px)"}, 128 {"(max-width: 600px[[]]]]), (max-width: 600px)", "not all, (max-width: 6 00px)", true},
108 {"(max-width: 500px[[[[[[[[[[]]]]), (max-width: 500px)", "not all"}, 129 {"(max-width: 500px[[[[[[[[[[]]]]), (max-width: 500px)", "not all", true },
109 {"(max-width: 800px{}), (max-width: 800px)", "not all, (max-width: 800px )"}, 130 {"(max-width: 800px{}), (max-width: 800px)", "not all, (max-width: 800px )", true},
110 {"(max-width: 900px{{}), (max-width: 900px)", "not all"}, 131 {"(max-width: 900px{{}), (max-width: 900px)", "not all", true},
111 {"(max-width: 600px{{}}}}), (max-width: 600px)", "not all, (max-width: 6 00px)"}, 132 {"(max-width: 600px{{}}}}), (max-width: 600px)", "not all, (max-width: 6 00px)", true},
112 {"(max-width: 500px{{{{{{{{{{}}}}), (max-width: 500px)", "not all"}, 133 {"(max-width: 500px{{{{{{{{{{}}}}), (max-width: 500px)", "not all", true },
113 {"[(), (max-width: 900px)", "not all"}, 134 {"[(), (max-width: 400px)", "not all", true},
114 {"[{}, (max-width: 900px)", "not all"}, 135 {"[{}, (max-width: 500px)", "not all", true},
115 {"[{]}], (max-width: 900px)", "not all, (max-width: 900px)"}, 136 {"[{]}], (max-width: 900px)", "not all, (max-width: 900px)", true},
116 {"[{[]{}{{{}}}}], (max-width: 900px)", "not all, (max-width: 900px)"}, 137 {"[{[]{}{{{}}}}], (max-width: 900px)", "not all, (max-width: 900px)", tr ue},
117 {"[{[}], (max-width: 900px)", "not all"}, 138 {"[{[}], (max-width: 900px)", "not all", true},
118 {"[({)}], (max-width: 900px)", "not all"}, 139 {"[({)}], (max-width: 900px)", "not all", true},
119 {"[]((), (max-width: 900px)", "not all"}, 140 {"[]((), (max-width: 900px)", "not all", true},
120 {"[](()), (max-width: 900px)", "not all, (max-width: 900px)"}, 141 {"((), (max-width: 900px)", "not all", true},
121 {"all an[isdfs bla())()]icalc(i)(()), (max-width: 900px)", "not all, (ma x-width: 900px)"}, 142 {"(foo(), (max-width: 900px)", "not all", true},
122 {"all an[isdfs bla())(]icalc(i)(()), (max-width: 900px)", "not all"}, 143 {"[](()), (max-width: 900px)", "not all, (max-width: 900px)", true},
123 {"all an[isdfs bla())(]icalc(i)(())), (max-width: 900px)", "not all"}, 144 {"all an[isdfs bla())()]icalc(i)(()), (max-width: 400px)", "not all, (ma x-width: 400px)", true},
124 {"all an[isdfs bla())(]icalc(i)(()))], (max-width: 900px)", "not all, (m ax-width: 900px)"}, 145 {"all an[isdfs bla())(]icalc(i)(()), (max-width: 500px)", "not all", tru e},
146 {"all an[isdfs bla())(]icalc(i)(())), (max-width: 600px)", "not all", tr ue},
147 {"all an[isdfs bla())(]icalc(i)(()))], (max-width: 800px)", "not all, (m ax-width: 800px)", true},
125 {0, 0} // Do not remove the terminator line. 148 {0, 0} // Do not remove the terminator line.
126 }; 149 };
127 150
128 for (unsigned i = 0; testCases[i].input; ++i) { 151 for (unsigned i = 0; testCases[i].input; ++i) {
129 RefPtrWillBeRawPtr<MediaQuerySet> querySet = MediaQuerySet::create(testC ases[i].input); 152 RefPtrWillBeRawPtr<MediaQuerySet> oldParserQuerySet = MediaQuerySet::cre ate(testCases[i].input);
130 StringBuilder output; 153 RefPtrWillBeRawPtr<MediaQuerySet> threadSafeQuerySet = MediaQuerySet::cr eateOffMainThread(testCases[i].input);
131 size_t j = 0; 154 testMediaQuery(testCases[i], *oldParserQuerySet, true);
132 while (j < querySet->queryVector().size()) { 155 testMediaQuery(testCases[i], *threadSafeQuerySet, false);
133 String queryText = querySet->queryVector()[j]->cssText();
134 output.append(queryText);
135 ++j;
136 if (j >= querySet->queryVector().size())
137 break;
138 output.append(", ");
139 }
140 if (testCases[i].output)
141 ASSERT_STREQ(testCases[i].output, output.toString().ascii().data());
142 else
143 ASSERT_STREQ(testCases[i].input, output.toString().ascii().data());
144 } 156 }
145 } 157 }
146 158
147 } // namespace 159 } // namespace
OLDNEW
« no previous file with comments | « no previous file | Source/core/css/parser/MediaQueryParser.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698