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
3// found in the LICENSE file.
4
5#include "config.h"
6#include "core/css/parser/SizesAttributeParser.h"
7
8#include "core/MediaTypeNames.h"
9#include "core/css/MediaValuesCached.h"
10
11#include <gtest/gtest.h>
12
13namespace blink {
14
15typedef struct {
16    const char* input;
17    const unsigned effectiveSize;
18    const bool viewportDependant;
19} TestCase;
20
21TEST(SizesAttributeParserTest, Basic)
22{
23    TestCase testCases[] = {
24        {"screen", 500, true},
25        {"(min-width:500px)", 500, true},
26        {"(min-width:500px) 200px", 200, false},
27        {"(min-width:500px) 50vw", 250, true},
28        {"(min-width:500px) 200px, 400px", 200, false},
29        {"400px, (min-width:500px) 200px", 400, false},
30        {"40vw, (min-width:500px) 201px", 200, true},
31        {"(min-width:500px) 201px, 40vw", 201, false},
32        {"(min-width:5000px) 40vw, 201px", 201, false},
33        {"(min-width:500px) calc(201px), calc(40vw)", 201, false},
34        {"(min-width:5000px) calc(40vw), calc(201px)", 201, false},
35        {"(min-width:5000px) 200px, 400px", 400, false},
36        {"(blalbadfsdf) 200px, 400px", 400, false},
37        {"0", 0, false},
38        {"-0", 0, false},
39        {"1", 500, true},
40        {"300px, 400px", 300, false},
41        {"(min-width:5000px) 200px, (min-width:500px) 400px", 400, false},
42        {"", 500, true},
43        {"  ", 500, true},
44        {" /**/ ", 500, true},
45        {" /**/ 300px", 300, false},
46        {"300px /**/ ", 300, false},
47        {" /**/ (min-width:500px) /**/ 300px", 300, false},
48        {"-100px, 200px", 200, false},
49        {"-50vw, 20vw", 100, true},
50        {"50asdf, 200px", 200, false},
51        {"asdf, 200px", 200, false},
52        {"(max-width: 3000px) 200w, 400w", 500, true},
53        {",, , /**/ ,200px", 200, false},
54        {"50vw", 250, true},
55        {"5em", 80, false},
56        {"5rem", 80, false},
57        {"calc(40vw*2)", 400, true},
58        {"(min-width:5000px) calc(5000px/10), (min-width:500px) calc(1200px/3)", 400, false},
59        {"(min-width:500px) calc(1200/3)", 500, true},
60        {"(min-width:500px) calc(1200px/(0px*14))", 500, true},
61        {"(max-width: 3000px) 200px, 400px", 200, false},
62        {"(max-width: 3000px) 20em, 40em", 320, false},
63        {"(max-width: 3000px) 0, 40em", 0, false},
64        {"(max-width: 3000px) 50vw, 40em", 250, true},
65        {"(max-width: 3000px) 50px, 40vw", 50, false},
66        {0, 0, false} // Do not remove the terminator line.
67    };
68
69    MediaValuesCached::MediaValuesCachedData data;
70    data.viewportWidth = 500;
71    data.viewportHeight = 500;
72    data.deviceWidth = 500;
73    data.deviceHeight = 500;
74    data.devicePixelRatio = 2.0;
75    data.colorBitsPerComponent = 24;
76    data.monochromeBitsPerComponent = 0;
77    data.primaryPointerType = PointerTypeFine;
78    data.defaultFontSize = 16;
79    data.threeDEnabled = true;
80    data.mediaType = MediaTypeNames::screen;
81    data.strictMode = true;
82    RefPtr<MediaValues> mediaValues = MediaValuesCached::create(data);
83
84    for (unsigned i = 0; testCases[i].input; ++i) {
85        SizesAttributeParser parser(mediaValues, testCases[i].input);
86        ASSERT_EQ(testCases[i].effectiveSize, parser.length());
87        ASSERT_EQ(testCases[i].viewportDependant, parser.viewportDependant());
88    }
89}
90
91} // namespace
92