// Copyright 2018 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 "components/zucchini/disassembler_dex.h" #include #include #include #include #include #include "testing/gtest/include/gtest/gtest.h" namespace zucchini { namespace { template size_t CountDistinct(const std::vector& v) { return std::set(v.begin(), v.end()).size(); } } // namespace // Ensures that ReferenceGroups from DisassemblerDex::MakeReferenceGroups() // cover each non-sentinel element in ReferenceType in order, exactly once. Also // ensures that the ReferenceType elements are grouped by ReferencePool, and // listed in increasing order. TEST(DisassemblerDexTest, ReferenceGroups) { std::vector pool_list; std::vector type_list; DisassemblerDex dis; for (ReferenceGroup group : dis.MakeReferenceGroups()) { pool_list.push_back(static_cast(group.pool_tag().value())); type_list.push_back(static_cast(group.type_tag().value())); } // Check ReferenceByte coverage. constexpr size_t kNumTypes = DisassemblerDex::kNumTypes; EXPECT_EQ(kNumTypes, type_list.size()); EXPECT_EQ(kNumTypes, CountDistinct(type_list)); EXPECT_TRUE(std::is_sorted(type_list.begin(), type_list.end())); // Check that ReferenceType elements are grouped by ReferencePool. Note that // repeats can occur, and pools can be skipped. EXPECT_TRUE(std::is_sorted(pool_list.begin(), pool_list.end())); } } // namespace zucchini