// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "remoting/client/notification/version_range.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace remoting {

TEST(VersionRangeTest, ExactVersionMatch) {
  VersionRange range("1.2.3");
  ASSERT_TRUE(range.IsValid());
  ASSERT_TRUE(range.ContainsVersion("1.2.3"));
  ASSERT_FALSE(range.ContainsVersion("1.2.1"));
  ASSERT_FALSE(range.ContainsVersion("1.2.5"));
}

TEST(VersionRangeTest, UnboundMinimumExclusiveMaximum) {
  VersionRange range("[-1.2.3)");
  ASSERT_TRUE(range.IsValid());
  ASSERT_TRUE(range.ContainsVersion("0.1"));
  ASSERT_TRUE(range.ContainsVersion("1.2"));
  ASSERT_TRUE(range.ContainsVersion("1.2.2"));
  ASSERT_FALSE(range.ContainsVersion("1.2.3"));
  ASSERT_FALSE(range.ContainsVersion("1.2.5"));
  ASSERT_FALSE(range.ContainsVersion("2"));
}

TEST(VersionRangeTest, UnboundMinimumInclusiveMaximum) {
  VersionRange range("[-1.2.3]");
  ASSERT_TRUE(range.IsValid());
  ASSERT_TRUE(range.ContainsVersion("0.1"));
  ASSERT_TRUE(range.ContainsVersion("1.2"));
  ASSERT_TRUE(range.ContainsVersion("1.2.2"));
  ASSERT_TRUE(range.ContainsVersion("1.2.3"));
  ASSERT_FALSE(range.ContainsVersion("1.2.5"));
  ASSERT_FALSE(range.ContainsVersion("2"));
}

TEST(VersionRangeTest, InclusiveMinimumUnboundMaximum) {
  VersionRange range("[1.2.3-)");
  ASSERT_TRUE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0.1"));
  ASSERT_FALSE(range.ContainsVersion("1.2.2"));
  ASSERT_TRUE(range.ContainsVersion("1.2.3"));
  ASSERT_TRUE(range.ContainsVersion("1.2.5"));
  ASSERT_TRUE(range.ContainsVersion("2"));
}

TEST(VersionRangeTest, ExclusiveMinimumUnboundMaximum) {
  VersionRange range("(1.2.3-)");
  ASSERT_TRUE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0.1"));
  ASSERT_FALSE(range.ContainsVersion("1.2.2"));
  ASSERT_FALSE(range.ContainsVersion("1.2.3"));
  ASSERT_TRUE(range.ContainsVersion("1.2.5"));
  ASSERT_TRUE(range.ContainsVersion("2"));
}

TEST(VersionRangeTest, InclusiveMinimumExclusiveMaximum) {
  VersionRange range("[1.2-3)");
  ASSERT_TRUE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0.1"));
  ASSERT_FALSE(range.ContainsVersion("1.1"));
  ASSERT_TRUE(range.ContainsVersion("1.2"));
  ASSERT_TRUE(range.ContainsVersion("1.2.2"));
  ASSERT_TRUE(range.ContainsVersion("1.2.3"));
  ASSERT_TRUE(range.ContainsVersion("2"));
  ASSERT_FALSE(range.ContainsVersion("3"));
  ASSERT_FALSE(range.ContainsVersion("4"));
}

TEST(VersionRangeTest, ExclusiveMinimumInclusiveMaximum) {
  VersionRange range("(1.2-3]");
  ASSERT_TRUE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0.1"));
  ASSERT_FALSE(range.ContainsVersion("1.1"));
  ASSERT_FALSE(range.ContainsVersion("1.2"));
  ASSERT_TRUE(range.ContainsVersion("1.2.2"));
  ASSERT_TRUE(range.ContainsVersion("1.2.3"));
  ASSERT_TRUE(range.ContainsVersion("2"));
  ASSERT_TRUE(range.ContainsVersion("3"));
  ASSERT_FALSE(range.ContainsVersion("3.1"));
  ASSERT_FALSE(range.ContainsVersion("4"));
}

TEST(VersionRangeTest, ExclusiveMinimumExclusiveMaximum) {
  VersionRange range("(1.2-3)");
  ASSERT_TRUE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0.1"));
  ASSERT_FALSE(range.ContainsVersion("1.1"));
  ASSERT_FALSE(range.ContainsVersion("1.2"));
  ASSERT_TRUE(range.ContainsVersion("1.2.2"));
  ASSERT_TRUE(range.ContainsVersion("1.2.3"));
  ASSERT_TRUE(range.ContainsVersion("2"));
  ASSERT_FALSE(range.ContainsVersion("3"));
  ASSERT_FALSE(range.ContainsVersion("3.1"));
  ASSERT_FALSE(range.ContainsVersion("4"));
}

TEST(VersionRangeTest, AnyVersion1) {
  VersionRange range("(-)");
  ASSERT_TRUE(range.IsValid());
  ASSERT_TRUE(range.ContainsVersion("1"));
  ASSERT_TRUE(range.ContainsVersion("1.1"));
  ASSERT_TRUE(range.ContainsVersion("2"));
  ASSERT_TRUE(range.ContainsVersion("3"));
  ASSERT_TRUE(range.ContainsVersion("4"));
}

TEST(VersionRangeTest, AnyVersion2) {
  VersionRange range("[-]");
  ASSERT_TRUE(range.IsValid());
  ASSERT_TRUE(range.ContainsVersion("1"));
  ASSERT_TRUE(range.ContainsVersion("1.1"));
  ASSERT_TRUE(range.ContainsVersion("2"));
  ASSERT_TRUE(range.ContainsVersion("3"));
  ASSERT_TRUE(range.ContainsVersion("4"));
}

TEST(VersionRangeTest, InvalidRangeSpec_SyntaxError1) {
  VersionRange range("");
  ASSERT_FALSE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0"));
  ASSERT_FALSE(range.ContainsVersion("1"));
}

TEST(VersionRangeTest, InvalidRangeSpec_SyntaxError2) {
  VersionRange range("90j3awef");
  ASSERT_FALSE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0"));
  ASSERT_FALSE(range.ContainsVersion("1"));
}

TEST(VersionRangeTest, InvalidRangeSpec_SyntaxError3) {
  VersionRange range("[1.2)");
  ASSERT_FALSE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0"));
  ASSERT_FALSE(range.ContainsVersion("1.2"));
}

TEST(VersionRangeTest, InvalidRangeSpec_SyntaxError4) {
  VersionRange range("[1.2-");
  ASSERT_FALSE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0"));
  ASSERT_FALSE(range.ContainsVersion("1.2"));
}

TEST(VersionRangeTest, InvalidRangeSpec_SyntaxError5) {
  VersionRange range("1.2-)");
  ASSERT_FALSE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0"));
  ASSERT_FALSE(range.ContainsVersion("1.2"));
}

TEST(VersionRangeTest, InvalidRangeSpec_SyntaxError6) {
  VersionRange range("1.2-");
  ASSERT_FALSE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0"));
  ASSERT_FALSE(range.ContainsVersion("1.2"));
}

TEST(VersionRangeTest, InvalidRangeSpec_SyntaxError7) {
  VersionRange range("-1.2");
  ASSERT_FALSE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0"));
  ASSERT_FALSE(range.ContainsVersion("1.2"));
}

TEST(VersionRangeTest, InvalidRangeSpec_SyntaxError8) {
  VersionRange range("[-1.2");
  ASSERT_FALSE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0"));
  ASSERT_FALSE(range.ContainsVersion("1.2"));
}

TEST(VersionRangeTest, InvalidRangeSpec_SyntaxError9) {
  VersionRange range("-1.2)");
  ASSERT_FALSE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("0"));
  ASSERT_FALSE(range.ContainsVersion("1.2"));
}

TEST(VersionRangeTest, InvalidRangeSpec_MinBiggerThanMax) {
  VersionRange range("[3.4-1.2)");
  ASSERT_FALSE(range.IsValid());
  ASSERT_FALSE(range.ContainsVersion("1.2"));
  ASSERT_FALSE(range.ContainsVersion("2.0"));
  ASSERT_FALSE(range.ContainsVersion("3.4"));
}

}  // namespace remoting