1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// found in the LICENSE file.
4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "config.h"
6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/css/parser/BisonCSSParser.h"
7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
8c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/css/MediaList.h"
9c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/css/StyleRule.h"
10c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "wtf/dtoa/utils.h"
117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "wtf/text/StringBuilder.h"
12d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include <gtest/gtest.h>
14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
15c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
16d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
17c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)static void testMediaQuery(const char* expected, MediaQuerySet& querySet)
18c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
19c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    const WillBeHeapVector<OwnPtrWillBeMember<MediaQuery> >& queryVector = querySet.queryVector();
20c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    size_t queryVectorSize = queryVector.size();
21c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    StringBuilder output;
22c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
23c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    for (size_t i = 0; i < queryVectorSize; ) {
24c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        String queryText = queryVector[i]->cssText();
25c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        output.append(queryText);
26c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ++i;
27c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (i >= queryVectorSize)
28c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            break;
299e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        output.appendLiteral(", ");
30c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ASSERT_STREQ(expected, output.toString().ascii().data());
32c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST(BisonCSSParserTest, MediaQuery)
35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    struct {
37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        const char* input;
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        const char* output;
39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    } testCases[] = {
40c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        {"@media s} {}", "not all"},
41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        {"@media } {}", "not all"},
42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        {"@media tv {}", "tv"},
43c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        {"@media tv, screen {}", "tv, screen"},
44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        {"@media s}, tv {}", "not all, tv"},
45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        {"@media tv, screen and (}) {}", "tv, not all"},
46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    };
47c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    BisonCSSParser parser(strictCSSParserContext());
49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    for (unsigned i = 0; i < ARRAY_SIZE(testCases); ++i) {
51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        RefPtrWillBeRawPtr<StyleRuleBase> rule = parser.parseRule(nullptr, String(testCases[i].input));
52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        EXPECT_TRUE(rule->isMediaRule());
54c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        testMediaQuery(testCases[i].output, *static_cast<StyleRuleMedia*>(rule.get())->mediaQueries());
55c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
56c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
57c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
58c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
59