blob: 1305e68b3fa0943945995c7802b099d21561c77e [file] [log] [blame]
// Copyright 2020 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 "third_party/blink/public/common/tokens/multi_token.h"
#include <algorithm>
#include "base/unguessable_token.h"
#include "base/util/type_safety/token_type.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
using FooToken = util::TokenType<class FooTokenTag>;
using BarToken = util::TokenType<class BarTokenTag>;
using BazToken = util::TokenType<class BazTokenTag>;
// Test MultiTokenVariantCount.
static_assert(internal::MultiTokenVariantCount<FooToken, BarToken>::kValue == 2,
"unexpected count");
static_assert(
internal::MultiTokenVariantCount<FooToken, BarToken, BazToken>::kValue == 3,
"unexpected count");
// Test MultiTokenTypeRepeated.
static_assert(!internal::MultiTokenTypeRepeated<FooToken>::kValue,
"unexpected repeated value");
static_assert(!internal::MultiTokenTypeRepeated<FooToken, FooToken>::kValue,
"unexpected repeated value");
static_assert(
!internal::MultiTokenTypeRepeated<FooToken, FooToken, BarToken>::kValue,
"unexpected repeated value");
static_assert(
internal::MultiTokenTypeRepeated<FooToken, FooToken, BarToken, FooToken>::
kValue,
"unexpected repeated value");
static_assert(
internal::MultiTokenTypeRepeated<FooToken, BarToken, FooToken, FooToken>::
kValue,
"unexpected repeated value");
// Test MultiTokenAnyTypeRepeated.
static_assert(!internal::MultiTokenAnyTypeRepeated<FooToken>::kValue,
"unexpected any repeated value");
static_assert(!internal::MultiTokenAnyTypeRepeated<FooToken, BarToken>::kValue,
"unexpected any repeated value");
static_assert(
!internal::MultiTokenAnyTypeRepeated<FooToken, BarToken, BazToken>::kValue,
"unexpected any repeated value");
static_assert(
internal::MultiTokenAnyTypeRepeated<FooToken, BarToken, FooToken>::kValue,
"unexpected any repeated value");
static_assert(
internal::MultiTokenAnyTypeRepeated<FooToken, BarToken, BarToken>::kValue,
"unexpected any repeated value");
// Test MultiTokenVariantIsTokenType.
static_assert(internal::MultiTokenVariantIsTokenType<FooToken>::kValue,
"unexpected is token type value");
static_assert(!internal::MultiTokenVariantIsTokenType<int>::kValue,
"unexpected is token type value");
// Test MultiTokenAllVariantsAreTokenType.
static_assert(
internal::MultiTokenAllVariantsAreTokenType<FooToken, BarToken>::kValue,
"unexpected all variants are token type value");
static_assert(!internal::MultiTokenAllVariantsAreTokenType<FooToken,
BarToken,
int>::kValue,
"unexpected all variants are token type value");
using FooBarToken = MultiToken<FooToken, BarToken>;
using FooBarBazToken = MultiToken<FooToken, BarToken, BazToken>;
TEST(MultiTokenTest, MultiTokenWorks) {
// Test default initialization.
FooBarToken token1;
EXPECT_FALSE(token1.value().is_empty());
EXPECT_EQ(0u, token1.variant_index());
EXPECT_TRUE(token1.Is<FooToken>());
EXPECT_FALSE(token1.Is<BarToken>());
// Test copy construction.
BarToken bar = BarToken();
FooBarToken token2(bar);
EXPECT_EQ(token2.value(), bar.value());
EXPECT_FALSE(token2.value().is_empty());
EXPECT_EQ(1u, token2.variant_index());
EXPECT_FALSE(token2.Is<FooToken>());
EXPECT_TRUE(token2.Is<BarToken>());
// Test assignment.
FooBarToken token3;
token3 = token2;
EXPECT_EQ(token3.value(), token2.value());
EXPECT_FALSE(token3.value().is_empty());
EXPECT_EQ(token2.variant_index(), token3.variant_index());
EXPECT_FALSE(token3.Is<FooToken>());
EXPECT_TRUE(token3.Is<BarToken>());
// Test comparison operators.
EXPECT_FALSE(token1 == token2);
EXPECT_TRUE(token1 != token2);
EXPECT_TRUE(token2 == token3);
EXPECT_FALSE(token2 != token3);
EXPECT_EQ(token1 < token2, token1.value() < token2.value());
EXPECT_FALSE(token2 < token3);
EXPECT_FALSE(token3 < token2);
// Test hasher.
EXPECT_EQ(FooBarToken::Hasher()(token2),
base::UnguessableTokenHash()(token2.value()));
// Test string representation.
EXPECT_EQ(token2.ToString(), token2.value().ToString());
// Test type conversions.
FooToken foo(token1.value());
EXPECT_EQ(foo, token1.GetAs<FooToken>());
EXPECT_EQ(token2.GetAs<BarToken>(), token3.GetAs<BarToken>());
}
} // namespace blink