1// Copyright (c) 2013 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 "gpu/config/gpu_control_list.h"
6#include "testing/gtest/include/gtest/gtest.h"
7
8namespace gpu {
9
10class VersionInfoTest : public testing::Test {
11 public:
12  VersionInfoTest() { }
13  virtual ~VersionInfoTest() { }
14
15  typedef GpuControlList::VersionInfo VersionInfo;
16};
17
18TEST_F(VersionInfoTest, ValidVersionInfo) {
19  const std::string op[] = {
20    "=",
21    "<",
22    "<=",
23    ">",
24    ">=",
25    "any",
26    "between"
27  };
28  for (size_t i = 0; i < arraysize(op); ++i) {
29    std::string string1;
30    std::string string2;
31    if (op[i] != "any")
32      string1 = "8.9";
33    if (op[i] == "between")
34      string2 = "9.0";
35    VersionInfo info(op[i], std::string(), string1, string2);
36    EXPECT_TRUE(info.IsValid());
37  }
38
39  const std::string style[] = {
40    "lexical",
41    "numerical",
42    ""  // Default, same as "numerical"
43  };
44  for (size_t i =0; i < arraysize(style); ++i) {
45    VersionInfo info("=", style[i], "8.9", std::string());
46    EXPECT_TRUE(info.IsValid());
47    if (style[i] == "lexical")
48      EXPECT_TRUE(info.IsLexical());
49    else
50      EXPECT_FALSE(info.IsLexical());
51  }
52
53  const std::string number[] = {
54    "10",
55    "10.9",
56    "10.0",
57    "10.0.9",
58    "0.8",
59    // Leading 0s are valid.
60    "10.09",
61    // Whitespaces are ignored.
62    " 10.9",
63    "10.9 ",
64    "10 .9",
65    "10. 9",
66  };
67  for (size_t i =0; i < arraysize(number); ++i) {
68    VersionInfo info("=", std::string(), number[i], std::string());
69    EXPECT_TRUE(info.IsValid());
70  }
71}
72
73TEST_F(VersionInfoTest, InvalidVersionInfo) {
74  const std::string op[] = {
75    "=",
76    "<",
77    "<=",
78    ">",
79    ">=",
80    "any",
81    "between"
82  };
83  for (size_t i = 0; i < arraysize(op); ++i) {
84    {
85      VersionInfo info(op[i], std::string(), "8.9", std::string());
86      if (op[i] == "between")
87        EXPECT_FALSE(info.IsValid());
88      else
89        EXPECT_TRUE(info.IsValid());
90    }
91    {
92      VersionInfo info(op[i], std::string(), std::string(), std::string());
93      if (op[i] == "any")
94        EXPECT_TRUE(info.IsValid());
95      else
96        EXPECT_FALSE(info.IsValid());
97    }
98    {
99      VersionInfo info(op[i], std::string(), "8.9", "9.0");
100      EXPECT_TRUE(info.IsValid());
101    }
102  }
103
104  const std::string number[] = {
105    "8.E",
106    "8-9",
107  };
108  for (size_t i = 0; i < arraysize(number); ++i) {
109    VersionInfo info("=", std::string(), number[i], std::string());
110    EXPECT_FALSE(info.IsValid());
111  }
112}
113
114TEST_F(VersionInfoTest, VersionComparison) {
115  {
116    VersionInfo info("any", std::string(), std::string(), std::string());
117    EXPECT_TRUE(info.Contains("0"));
118    EXPECT_TRUE(info.Contains("8.9"));
119    EXPECT_TRUE(info.Contains("100"));
120  }
121  {
122    VersionInfo info(">", std::string(), "8.9", std::string());
123    EXPECT_FALSE(info.Contains("7"));
124    EXPECT_FALSE(info.Contains("8.9"));
125    EXPECT_FALSE(info.Contains("8.9.1"));
126    EXPECT_TRUE(info.Contains("9"));
127  }
128  {
129    VersionInfo info(">=", std::string(), "8.9", std::string());
130    EXPECT_FALSE(info.Contains("7"));
131    EXPECT_TRUE(info.Contains("8.9"));
132    EXPECT_TRUE(info.Contains("8.9.1"));
133    EXPECT_TRUE(info.Contains("9"));
134  }
135  {
136    VersionInfo info("=", std::string(), "8.9", std::string());
137    EXPECT_FALSE(info.Contains("7"));
138    EXPECT_TRUE(info.Contains("8"));
139    EXPECT_TRUE(info.Contains("8.9"));
140    EXPECT_TRUE(info.Contains("8.9.1"));
141    EXPECT_FALSE(info.Contains("9"));
142  }
143  {
144    VersionInfo info("<", std::string(), "8.9", std::string());
145    EXPECT_TRUE(info.Contains("7"));
146    EXPECT_TRUE(info.Contains("8.8"));
147    EXPECT_FALSE(info.Contains("8"));
148    EXPECT_FALSE(info.Contains("8.9"));
149    EXPECT_FALSE(info.Contains("8.9.1"));
150    EXPECT_FALSE(info.Contains("9"));
151  }
152  {
153    VersionInfo info("<=", std::string(), "8.9", std::string());
154    EXPECT_TRUE(info.Contains("7"));
155    EXPECT_TRUE(info.Contains("8.8"));
156    EXPECT_TRUE(info.Contains("8"));
157    EXPECT_TRUE(info.Contains("8.9"));
158    EXPECT_TRUE(info.Contains("8.9.1"));
159    EXPECT_FALSE(info.Contains("9"));
160  }
161  {
162    VersionInfo info("between", std::string(), "8.9", "9.1");
163    EXPECT_FALSE(info.Contains("7"));
164    EXPECT_FALSE(info.Contains("8.8"));
165    EXPECT_TRUE(info.Contains("8"));
166    EXPECT_TRUE(info.Contains("8.9"));
167    EXPECT_TRUE(info.Contains("8.9.1"));
168    EXPECT_TRUE(info.Contains("9"));
169    EXPECT_TRUE(info.Contains("9.1"));
170    EXPECT_TRUE(info.Contains("9.1.9"));
171    EXPECT_FALSE(info.Contains("9.2"));
172    EXPECT_FALSE(info.Contains("10"));
173  }
174}
175
176TEST_F(VersionInfoTest, DateComparison) {
177  // When we use '-' as splitter, we assume a format of mm-dd-yyyy
178  // or mm-yyyy, i.e., a date.
179  {
180    VersionInfo info("=", std::string(), "1976.3.21", std::string());
181    EXPECT_TRUE(info.Contains("3-21-1976", '-'));
182    EXPECT_TRUE(info.Contains("3-1976", '-'));
183    EXPECT_TRUE(info.Contains("03-1976", '-'));
184    EXPECT_FALSE(info.Contains("21-3-1976", '-'));
185  }
186  {
187    VersionInfo info(">", std::string(), "1976.3.21", std::string());
188    EXPECT_TRUE(info.Contains("3-22-1976", '-'));
189    EXPECT_TRUE(info.Contains("4-1976", '-'));
190    EXPECT_TRUE(info.Contains("04-1976", '-'));
191    EXPECT_FALSE(info.Contains("3-1976", '-'));
192    EXPECT_FALSE(info.Contains("2-1976", '-'));
193  }
194  {
195    VersionInfo info("between", std::string(), "1976.3.21", "2012.12.25");
196    EXPECT_FALSE(info.Contains("3-20-1976", '-'));
197    EXPECT_TRUE(info.Contains("3-21-1976", '-'));
198    EXPECT_TRUE(info.Contains("3-22-1976", '-'));
199    EXPECT_TRUE(info.Contains("3-1976", '-'));
200    EXPECT_TRUE(info.Contains("4-1976", '-'));
201    EXPECT_TRUE(info.Contains("1-1-2000", '-'));
202    EXPECT_TRUE(info.Contains("1-2000", '-'));
203    EXPECT_TRUE(info.Contains("2000", '-'));
204    EXPECT_TRUE(info.Contains("11-2012", '-'));
205    EXPECT_TRUE(info.Contains("12-2012", '-'));
206    EXPECT_TRUE(info.Contains("12-24-2012", '-'));
207    EXPECT_TRUE(info.Contains("12-25-2012", '-'));
208    EXPECT_FALSE(info.Contains("12-26-2012", '-'));
209    EXPECT_FALSE(info.Contains("1-2013", '-'));
210    EXPECT_FALSE(info.Contains("2013", '-'));
211  }
212}
213
214TEST_F(VersionInfoTest, LexicalComparison) {
215  // When we use lexical style, we assume a format major.minor.*.
216  // We apply numerical comparison to major, lexical comparison to others.
217  {
218    VersionInfo info("<", "lexical", "8.201", std::string());
219    EXPECT_TRUE(info.Contains("8.001.100"));
220    EXPECT_TRUE(info.Contains("8.109"));
221    EXPECT_TRUE(info.Contains("8.10900"));
222    EXPECT_TRUE(info.Contains("8.109.100"));
223    EXPECT_TRUE(info.Contains("8.2"));
224    EXPECT_TRUE(info.Contains("8.20"));
225    EXPECT_TRUE(info.Contains("8.200"));
226    EXPECT_TRUE(info.Contains("8.20.100"));
227    EXPECT_FALSE(info.Contains("8.201"));
228    EXPECT_FALSE(info.Contains("8.2010"));
229    EXPECT_FALSE(info.Contains("8.21"));
230    EXPECT_FALSE(info.Contains("8.21.100"));
231    EXPECT_FALSE(info.Contains("9.002"));
232    EXPECT_FALSE(info.Contains("9.201"));
233    EXPECT_FALSE(info.Contains("12"));
234    EXPECT_FALSE(info.Contains("12.201"));
235  }
236  {
237    VersionInfo info("<", "lexical", "9.002", std::string());
238    EXPECT_TRUE(info.Contains("8.001.100"));
239    EXPECT_TRUE(info.Contains("8.109"));
240    EXPECT_TRUE(info.Contains("8.10900"));
241    EXPECT_TRUE(info.Contains("8.109.100"));
242    EXPECT_TRUE(info.Contains("8.2"));
243    EXPECT_TRUE(info.Contains("8.20"));
244    EXPECT_TRUE(info.Contains("8.200"));
245    EXPECT_TRUE(info.Contains("8.20.100"));
246    EXPECT_TRUE(info.Contains("8.201"));
247    EXPECT_TRUE(info.Contains("8.2010"));
248    EXPECT_TRUE(info.Contains("8.21"));
249    EXPECT_TRUE(info.Contains("8.21.100"));
250    EXPECT_FALSE(info.Contains("9.002"));
251    EXPECT_FALSE(info.Contains("9.201"));
252    EXPECT_FALSE(info.Contains("12"));
253    EXPECT_FALSE(info.Contains("12.201"));
254  }
255}
256
257}  // namespace gpu
258
259