/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "dex/primitive.h" #include "gtest/gtest.h" namespace art { namespace { void CheckPrimitiveTypeWidensTo(Primitive::Type from, const std::vector& expected_to_types) { std::vector actual_to_types; int last = static_cast(Primitive::Type::kPrimLast); for (int i = 0; i <= last; ++i) { Primitive::Type to = static_cast(i); if (Primitive::IsWidenable(from, to)) { actual_to_types.push_back(to); } } EXPECT_EQ(expected_to_types, actual_to_types); } } // namespace TEST(PrimitiveTest, NotWidensTo) { const std::vector to_types = {}; CheckPrimitiveTypeWidensTo(Primitive::Type::kPrimNot, to_types); } TEST(PrimitiveTest, BooleanWidensTo) { const std::vector to_types = {}; CheckPrimitiveTypeWidensTo(Primitive::Type::kPrimBoolean, to_types); } TEST(PrimitiveTest, ByteWidensTo) { const std::vector to_types = { Primitive::Type::kPrimByte, Primitive::Type::kPrimShort, Primitive::Type::kPrimInt, Primitive::Type::kPrimLong, Primitive::Type::kPrimFloat, Primitive::Type::kPrimDouble, }; CheckPrimitiveTypeWidensTo(Primitive::Type::kPrimByte, to_types); } TEST(PrimitiveTest, CharWidensTo) { const std::vector to_types = { Primitive::Type::kPrimChar, Primitive::Type::kPrimInt, Primitive::Type::kPrimLong, Primitive::Type::kPrimFloat, Primitive::Type::kPrimDouble, }; CheckPrimitiveTypeWidensTo(Primitive::Type::kPrimChar, to_types); } TEST(PrimitiveTest, ShortWidensTo) { const std::vector to_types = { Primitive::Type::kPrimShort, Primitive::Type::kPrimInt, Primitive::Type::kPrimLong, Primitive::Type::kPrimFloat, Primitive::Type::kPrimDouble, }; CheckPrimitiveTypeWidensTo(Primitive::Type::kPrimShort, to_types); } TEST(PrimitiveTest, IntWidensTo) { const std::vector to_types = { Primitive::Type::kPrimInt, Primitive::Type::kPrimLong, Primitive::Type::kPrimFloat, Primitive::Type::kPrimDouble, }; CheckPrimitiveTypeWidensTo(Primitive::Type::kPrimInt, to_types); } TEST(PrimitiveTest, LongWidensTo) { const std::vector to_types = { Primitive::Type::kPrimLong, Primitive::Type::kPrimFloat, Primitive::Type::kPrimDouble, }; CheckPrimitiveTypeWidensTo(Primitive::Type::kPrimLong, to_types); } TEST(PrimitiveTest, FloatWidensTo) { const std::vector to_types = { Primitive::Type::kPrimFloat, Primitive::Type::kPrimDouble, }; CheckPrimitiveTypeWidensTo(Primitive::Type::kPrimFloat, to_types); } TEST(PrimitiveTest, DoubleWidensTo) { const std::vector to_types = { Primitive::Type::kPrimDouble, }; CheckPrimitiveTypeWidensTo(Primitive::Type::kPrimDouble, to_types); } TEST(PrimitiveTest, VoidWidensTo) { const std::vector to_types = {}; CheckPrimitiveTypeWidensTo(Primitive::Type::kPrimVoid, to_types); } } // namespace art