Path: blob/master/test/hotspot/gtest/utilities/test_enumIterator.cpp
41145 views
/*1* Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223#include "precompiled.hpp"24#include "utilities/enumIterator.hpp"25#include <type_traits>26#include "unittest.hpp"2728enum class ExplicitTest : int { value1, value2, value3 };29ENUMERATOR_RANGE(ExplicitTest, ExplicitTest::value1, ExplicitTest::value3);30constexpr int explicit_start = 0;31constexpr int explicit_end = 3;3233enum class ImplicitTest : int {};34ENUMERATOR_VALUE_RANGE(ImplicitTest, 5, 10);35constexpr int implicit_start = 5;36constexpr int implicit_end = 10;3738TEST(TestEnumIterator, explicit_full_range) {39using Range = EnumRange<ExplicitTest>;40constexpr Range range{};41EXPECT_TRUE((std::is_same<ExplicitTest, Range::EnumType>::value));42EXPECT_EQ(size_t(explicit_end - explicit_start), range.size());43EXPECT_EQ(ExplicitTest::value1, range.first());44EXPECT_EQ(ExplicitTest::value3, range.last());45EXPECT_EQ(size_t(1), range.index(ExplicitTest::value2));46}4748TEST(TestEnumIterator, explicit_partial_range) {49using Range = EnumRange<ExplicitTest>;50constexpr Range range{ExplicitTest::value2};51EXPECT_TRUE((std::is_same<ExplicitTest, Range::EnumType>::value));52EXPECT_EQ(size_t(explicit_end - (explicit_start + 1)), range.size());53EXPECT_EQ(ExplicitTest::value2, range.first());54EXPECT_EQ(ExplicitTest::value3, range.last());55EXPECT_EQ(size_t(0), range.index(ExplicitTest::value2));56}5758TEST(TestEnumIterator, implicit_full_range) {59using Range = EnumRange<ImplicitTest>;60constexpr Range range{};61EXPECT_TRUE((std::is_same<ImplicitTest, Range::EnumType>::value));62EXPECT_EQ(size_t(implicit_end - implicit_start), range.size());63EXPECT_EQ(static_cast<ImplicitTest>(implicit_start), range.first());64EXPECT_EQ(static_cast<ImplicitTest>(implicit_end - 1), range.last());65EXPECT_EQ(size_t(2), range.index(static_cast<ImplicitTest>(implicit_start + 2)));66}6768TEST(TestEnumIterator, implicit_partial_range) {69using Range = EnumRange<ImplicitTest>;70constexpr Range range{static_cast<ImplicitTest>(implicit_start + 2)};71EXPECT_TRUE((std::is_same<ImplicitTest, Range::EnumType>::value));72EXPECT_EQ(size_t(implicit_end - (implicit_start + 2)), range.size());73EXPECT_EQ(static_cast<ImplicitTest>(implicit_start + 2), range.first());74EXPECT_EQ(static_cast<ImplicitTest>(implicit_end - 1), range.last());75EXPECT_EQ(size_t(1), range.index(static_cast<ImplicitTest>(implicit_start + 3)));76}7778TEST(TestEnumIterator, explict_iterator) {79using Range = EnumRange<ExplicitTest>;80using Iterator = EnumIterator<ExplicitTest>;81constexpr Range range{};82EXPECT_EQ(range.first(), *range.begin());83EXPECT_EQ(Iterator(range.first()), range.begin());84EnumIterator<ExplicitTest> it = range.begin();85++it;86EXPECT_EQ(ExplicitTest::value2, *it);87it = range.begin();88for (int i = explicit_start; i < explicit_end; ++i, ++it) {89ExplicitTest value = static_cast<ExplicitTest>(i);90EXPECT_EQ(value, *it);91EXPECT_EQ(Iterator(value), it);92EXPECT_EQ(size_t(i - explicit_start), range.index(value));93}94EXPECT_EQ(it, range.end());95}9697TEST(TestEnumIterator, implicit_iterator) {98using Range = EnumRange<ImplicitTest>;99using Iterator = EnumIterator<ImplicitTest>;100constexpr Range range{};101EXPECT_EQ(range.first(), *range.begin());102EXPECT_EQ(Iterator(range.first()), range.begin());103EnumIterator<ImplicitTest> it = range.begin();104for (int i = implicit_start; i < implicit_end; ++i, ++it) {105ImplicitTest value = static_cast<ImplicitTest>(i);106EXPECT_EQ(value, *it);107EXPECT_EQ(Iterator(value), it);108EXPECT_EQ(size_t(i - implicit_start), range.index(value));109}110EXPECT_EQ(it, range.end());111}112113TEST(TestEnumIterator, explict_range_based_for_loop_full) {114int i = explicit_start;115for (ExplicitTest value : EnumRange<ExplicitTest>{}) {116EXPECT_EQ(size_t(i - explicit_start), EnumRange<ExplicitTest>{}.index(value));117EXPECT_TRUE(value == ExplicitTest::value1 ||118value == ExplicitTest::value2 ||119value == ExplicitTest::value3);120++i;121}122}123124TEST(TestEnumIterator, explict_range_based_for_loop_start) {125constexpr EnumRange<ExplicitTest> range{ExplicitTest::value2};126int start = explicit_start + 2;127int i = start;128for (ExplicitTest value : range) {129EXPECT_EQ(size_t(i - start), range.index(value));130EXPECT_TRUE(value == ExplicitTest::value2 || value == ExplicitTest::value3);131EXPECT_TRUE(value != ExplicitTest::value1);132++i;133}134}135136TEST(TestEnumIterator, explict_range_based_for_loop_start_end) {137constexpr EnumRange<ExplicitTest> range{ExplicitTest::value1, ExplicitTest::value2};138int start = explicit_start + 1;139int i = start;140for (ExplicitTest value : range) {141EXPECT_EQ(size_t(i - start), range.index(value));142EXPECT_TRUE(value == ExplicitTest::value1 || value == ExplicitTest::value2);143EXPECT_TRUE(value != ExplicitTest::value3);144++i;145}146}147148TEST(TestEnumIterator, implicit_range_based_for_loop) {149int i = implicit_start;150for (ImplicitTest value : EnumRange<ImplicitTest>{}) {151EXPECT_EQ(size_t(i - implicit_start), EnumRange<ImplicitTest>{}.index(value));152++i;153}154}155156TEST(TestEnumIterator, implicit_range_based_for_loop_start) {157int start = implicit_start + 1;158EnumRange<ImplicitTest> range{static_cast<ImplicitTest>(start)};159int i = start;160for (ImplicitTest value : range) {161EXPECT_EQ(size_t(i - start), range.index(value));162int iv = static_cast<int>(value);163EXPECT_TRUE(start <= iv && iv <= implicit_end);164++i;165}166}167168TEST(TestEnumIterator, implicit_range_based_for_loop_start_end) {169int start = implicit_start + 1;170int end = implicit_end - 1;171EnumRange<ImplicitTest> range{static_cast<ImplicitTest>(start), static_cast<ImplicitTest>(end)};172int i = start;173for (ImplicitTest value : range) {174EXPECT_EQ(size_t(i - start), range.index(value));175int iv = static_cast<int>(value);176EXPECT_TRUE(start <= iv && iv <= end);177++i;178}179}180181#ifdef ASSERT182183static volatile ExplicitTest empty_range_value = ExplicitTest::value1;184static volatile size_t empty_range_index =185EnumRange<ExplicitTest>().index(empty_range_value);186187TEST_VM_ASSERT(TestEnumIterator, empty_range_first) {188constexpr ExplicitTest start = ExplicitTest::value2;189EXPECT_FALSE(empty_range_value == EnumRange<ExplicitTest>(start, start).first());190}191192TEST_VM_ASSERT(TestEnumIterator, empty_range_last) {193constexpr ExplicitTest start = ExplicitTest::value2;194EXPECT_FALSE(empty_range_value == EnumRange<ExplicitTest>(start, start).last());195}196197TEST_VM_ASSERT(TestEnumIterator, empty_range_index) {198constexpr ExplicitTest start = ExplicitTest::value2;199EXPECT_FALSE(empty_range_index == EnumRange<ExplicitTest>(start, start).index(start));200}201202TEST_VM_ASSERT(TestEnumIterator, end_iterator_dereference) {203EXPECT_FALSE(empty_range_value == *(EnumRange<ExplicitTest>().end()));204}205206const int invalid_implicit_int = implicit_start - 1;207static volatile ImplicitTest invalid_implicit_value =208static_cast<ImplicitTest>(invalid_implicit_int);209210TEST_VM_ASSERT(TestEnumIterator, invalid_range) {211EXPECT_TRUE(invalid_implicit_value == EnumRange<ImplicitTest>(invalid_implicit_value).first());212}213214TEST_VM_ASSERT(TestEnumIterator, invalid_iterator) {215EXPECT_TRUE(invalid_implicit_value == *EnumIterator<ImplicitTest>(invalid_implicit_value));216}217218#endif // ASSERT219220221