// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/version.h"

#include <utility>

#include "base/macros.h"
#include "starboard/types.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {

TEST(VersionTest, DefaultConstructor) {
  base::Version v;
  EXPECT_FALSE(v.IsValid());
}

TEST(VersionTest, ValueSemantics) {
  base::Version v1("1.2.3.4");
  EXPECT_TRUE(v1.IsValid());
  base::Version v3;
  EXPECT_FALSE(v3.IsValid());
  {
    base::Version v2(v1);
    v3 = v2;
    EXPECT_TRUE(v2.IsValid());
    EXPECT_EQ(v1, v2);
  }
  EXPECT_EQ(v3, v1);
}

TEST(VersionTest, MoveSemantics) {
  const std::vector<uint32_t> components = {1, 2, 3, 4};
  base::Version v1(std::move(components));
  EXPECT_TRUE(v1.IsValid());
  base::Version v2("1.2.3.4");
  EXPECT_EQ(v1, v2);
}

TEST(VersionTest, GetVersionFromString) {
  static const struct version_string {
    const char* input;
    size_t parts;
    uint32_t firstpart;
    bool success;
  } cases[] = {
    {"", 0, 0, false},
    {" ", 0, 0, false},
    {"\t", 0, 0, false},
    {"\n", 0, 0, false},
    {"  ", 0, 0, false},
    {".", 0, 0, false},
    {" . ", 0, 0, false},
    {"0", 1, 0, true},
    {"0.", 0, 0, false},
    {"0.0", 2, 0, true},
    {"4294967295.0", 2, 4294967295, true},
    {"4294967296.0", 0, 0, false},
    {"-1.0", 0, 0, false},
    {"1.-1.0", 0, 0, false},
    {"1,--1.0", 0, 0, false},
    {"+1.0", 0, 0, false},
    {"1.+1.0", 0, 0, false},
    {"1+1.0", 0, 0, false},
    {"++1.0", 0, 0, false},
    {"1.0a", 0, 0, false},
    {"1.2.3.4.5.6.7.8.9.0", 10, 1, true},
    {"02.1", 0, 0, false},
    {"0.01", 2, 0, true},
    {"f.1", 0, 0, false},
    {"15.007.20011", 3, 15, true},
    {"15.5.28.130162", 4, 15, true},
  };

  for (size_t i = 0; i < arraysize(cases); ++i) {
    base::Version version(cases[i].input);
    EXPECT_EQ(cases[i].success, version.IsValid());
    if (cases[i].success) {
      EXPECT_EQ(cases[i].parts, version.components().size());
      EXPECT_EQ(cases[i].firstpart, version.components()[0]);
    }
  }
}

TEST(VersionTest, Compare) {
  static const struct version_compare {
    const char* lhs;
    const char* rhs;
    int expected;
  } cases[] = {
      {"1.0", "1.0", 0},
      {"1.0", "0.0", 1},
      {"1.0", "2.0", -1},
      {"1.0", "1.1", -1},
      {"1.1", "1.0", 1},
      {"1.0", "1.0.1", -1},
      {"1.1", "1.0.1", 1},
      {"1.1", "1.0.1", 1},
      {"1.0.0", "1.0", 0},
      {"1.0.3", "1.0.20", -1},
      {"11.0.10", "15.007.20011", -1},
      {"11.0.10", "15.5.28.130162", -1},
      {"15.5.28.130162", "15.5.28.130162", 0},
  };
  for (size_t i = 0; i < arraysize(cases); ++i) {
    base::Version lhs(cases[i].lhs);
    base::Version rhs(cases[i].rhs);
    EXPECT_EQ(lhs.CompareTo(rhs), cases[i].expected) <<
        cases[i].lhs << " ? " << cases[i].rhs;
    // CompareToWildcardString() should have same behavior as CompareTo() when
    // no wildcards are present.
    EXPECT_EQ(lhs.CompareToWildcardString(cases[i].rhs), cases[i].expected)
        << cases[i].lhs << " ? " << cases[i].rhs;
    EXPECT_EQ(rhs.CompareToWildcardString(cases[i].lhs), -cases[i].expected)
        << cases[i].lhs << " ? " << cases[i].rhs;

    // Test comparison operators
    switch (cases[i].expected) {
    case -1:
      EXPECT_LT(lhs, rhs);
      EXPECT_LE(lhs, rhs);
      EXPECT_NE(lhs, rhs);
      EXPECT_FALSE(lhs == rhs);
      EXPECT_FALSE(lhs >= rhs);
      EXPECT_FALSE(lhs > rhs);
      break;
    case 0:
      EXPECT_FALSE(lhs < rhs);
      EXPECT_LE(lhs, rhs);
      EXPECT_FALSE(lhs != rhs);
      EXPECT_EQ(lhs, rhs);
      EXPECT_GE(lhs, rhs);
      EXPECT_FALSE(lhs > rhs);
      break;
    case 1:
      EXPECT_FALSE(lhs < rhs);
      EXPECT_FALSE(lhs <= rhs);
      EXPECT_NE(lhs, rhs);
      EXPECT_FALSE(lhs == rhs);
      EXPECT_GE(lhs, rhs);
      EXPECT_GT(lhs, rhs);
      break;
    }
  }
}

TEST(VersionTest, CompareToWildcardString) {
  static const struct version_compare {
    const char* lhs;
    const char* rhs;
    int expected;
  } cases[] = {
    {"1.0", "1.*", 0},
    {"1.0", "0.*", 1},
    {"1.0", "2.*", -1},
    {"1.2.3", "1.2.3.*", 0},
    {"10.0", "1.0.*", 1},
    {"1.0", "3.0.*", -1},
    {"1.4", "1.3.0.*", 1},
    {"1.3.9", "1.3.*", 0},
    {"1.4.1", "1.3.*", 1},
    {"1.3", "1.4.5.*", -1},
    {"1.5", "1.4.5.*", 1},
    {"1.3.9", "1.3.*", 0},
    {"1.2.0.0.0.0", "1.2.*", 0},
  };
  for (size_t i = 0; i < arraysize(cases); ++i) {
    const base::Version version(cases[i].lhs);
    const int result = version.CompareToWildcardString(cases[i].rhs);
    EXPECT_EQ(result, cases[i].expected) << cases[i].lhs << "?" << cases[i].rhs;
  }
}

TEST(VersionTest, IsValidWildcardString) {
  static const struct version_compare {
    const char* version;
    bool expected;
  } cases[] = {
    {"1.0", true},
    {"", false},
    {"1.2.3.4.5.6", true},
    {"1.2.3.*", true},
    {"1.2.3.5*", false},
    {"1.2.3.56*", false},
    {"1.*.3", false},
    {"20.*", true},
    {"+2.*", false},
    {"*", false},
    {"*.2", false},
  };
  for (size_t i = 0; i < arraysize(cases); ++i) {
    EXPECT_EQ(base::Version::IsValidWildcardString(cases[i].version),
        cases[i].expected) << cases[i].version << "?" << cases[i].expected;
  }
}

}  // namespace
