Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2012 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 "base/version.h"
      6 
      7 #include "testing/gtest/include/gtest/gtest.h"
      8 
      9 namespace {
     10 
     11 TEST(VersionTest, DefaultConstructor) {
     12   Version v;
     13   EXPECT_FALSE(v.IsValid());
     14 }
     15 
     16 TEST(VersionTest, ValueSemantics) {
     17   Version v1("1.2.3.4");
     18   EXPECT_TRUE(v1.IsValid());
     19   Version v3;
     20   EXPECT_FALSE(v3.IsValid());
     21   {
     22     Version v2(v1);
     23     v3 = v2;
     24     EXPECT_TRUE(v2.IsValid());
     25     EXPECT_TRUE(v1.Equals(v2));
     26   }
     27   EXPECT_TRUE(v3.Equals(v1));
     28 }
     29 
     30 TEST(VersionTest, GetVersionFromString) {
     31   static const struct version_string {
     32     const char* input;
     33     size_t parts;
     34     bool success;
     35   } cases[] = {
     36     {"", 0, false},
     37     {" ", 0, false},
     38     {"\t", 0, false},
     39     {"\n", 0, false},
     40     {"  ", 0, false},
     41     {".", 0, false},
     42     {" . ", 0, false},
     43     {"0", 1, true},
     44     {"0.0", 2, true},
     45     {"65537.0", 0, false},
     46     {"-1.0", 0, false},
     47     {"1.-1.0", 0, false},
     48     {"+1.0", 0, false},
     49     {"1.+1.0", 0, false},
     50     {"1.0a", 0, false},
     51     {"1.2.3.4.5.6.7.8.9.0", 10, true},
     52     {"02.1", 0, false},
     53     {"f.1", 0, false},
     54   };
     55 
     56   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
     57     Version version(cases[i].input);
     58     EXPECT_EQ(cases[i].success, version.IsValid());
     59     if (cases[i].success)
     60       EXPECT_EQ(cases[i].parts, version.components().size());
     61   }
     62 }
     63 
     64 TEST(VersionTest, Compare) {
     65   static const struct version_compare {
     66     const char* lhs;
     67     const char* rhs;
     68     int expected;
     69   } cases[] = {
     70     {"1.0", "1.0", 0},
     71     {"1.0", "0.0", 1},
     72     {"1.0", "2.0", -1},
     73     {"1.0", "1.1", -1},
     74     {"1.1", "1.0", 1},
     75     {"1.0", "1.0.1", -1},
     76     {"1.1", "1.0.1", 1},
     77     {"1.1", "1.0.1", 1},
     78     {"1.0.0", "1.0", 0},
     79     {"1.0.3", "1.0.20", -1},
     80   };
     81   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
     82     Version lhs(cases[i].lhs);
     83     Version rhs(cases[i].rhs);
     84     EXPECT_EQ(lhs.CompareTo(rhs), cases[i].expected) <<
     85         cases[i].lhs << " ? " << cases[i].rhs;
     86 
     87     EXPECT_EQ(lhs.IsOlderThan(cases[i].rhs), (cases[i].expected == -1));
     88   }
     89 }
     90 
     91 TEST(VersionTest, CompareToWildcardString) {
     92   static const struct version_compare {
     93     const char* lhs;
     94     const char* rhs;
     95     int expected;
     96   } cases[] = {
     97     {"1.0", "1.*", 0},
     98     {"1.0", "0.*", 1},
     99     {"1.0", "2.*", -1},
    100     {"1.2.3", "1.2.3.*", 0},
    101     {"10.0", "1.0.*", 1},
    102     {"1.0", "3.0.*", -1},
    103     {"1.4", "1.3.0.*", 1},
    104     {"1.3.9", "1.3.*", 0},
    105     {"1.4.1", "1.3.*", 1},
    106     {"1.3", "1.4.5.*", -1},
    107     {"1.5", "1.4.5.*", 1},
    108     {"1.3.9", "1.3.*", 0},
    109     {"1.2.0.0.0.0", "1.2.*", 0},
    110   };
    111   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
    112     const Version version(cases[i].lhs);
    113     const int result = version.CompareToWildcardString(cases[i].rhs);
    114     EXPECT_EQ(result, cases[i].expected) << cases[i].lhs << "?" << cases[i].rhs;
    115   }
    116 }
    117 
    118 TEST(VersionTest, IsValidWildcardString) {
    119   static const struct version_compare {
    120     const char* version;
    121     bool expected;
    122   } cases[] = {
    123     {"1.0", true},
    124     {"", false},
    125     {"1.2.3.4.5.6", true},
    126     {"1.2.3.*", true},
    127     {"1.2.3.5*", false},
    128     {"1.2.3.56*", false},
    129     {"1.*.3", false},
    130     {"20.*", true},
    131     {"+2.*", false},
    132     {"*", false},
    133     {"*.2", false},
    134   };
    135   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
    136     EXPECT_EQ(Version::IsValidWildcardString(cases[i].version),
    137         cases[i].expected) << cases[i].version << "?" << cases[i].expected;
    138   }
    139 }
    140 
    141 }  // namespace
    142