C++程序  |  75行  |  2.7 KB

/*
 * Copyright 2019 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 "tuningfork/annotation_util.h"

#include "gtest/gtest.h"

using namespace annotation_util;

std::vector<int> TestSetup(const std::vector<int>& enum_sizes,
                           const std::vector<int>& expected){
    std::vector<int> radix_mult;
    SetUpAnnotationRadixes(radix_mult, enum_sizes);
    EXPECT_EQ(radix_mult, expected);
    return radix_mult;
}

TEST(Annotation, Setup) {
    TestSetup( {}, { 1 } );
    TestSetup( { 1 }, { 2 } );
    TestSetup( { 1, 1 }, { 2, 4 } );
    TestSetup( { 1, 1, 1 }, { 2, 4, 8 } );
    TestSetup( { 2, 1, 1 }, { 3, 6, 12 } );
}

void CheckEncodeDecode(AnnotationId id,
                       const std::vector<int>& radix_mult, const std::string& err) {
    SerializedAnnotation ser;
    EXPECT_EQ(SerializeAnnotationId(id, ser, radix_mult), 0) << err << ": error serializing";
    auto back = DecodeAnnotationSerialization( ser, radix_mult);
    EXPECT_EQ(id, back) << err;
}
TEST(Annotation, EncodeDecodeGood) {
    auto radix_mult = TestSetup( {2, 3, 4} , {3, 12, 60} );
    CheckEncodeDecode( 1, radix_mult, "First");
    CheckEncodeDecode( 2, radix_mult, "Second");
    CheckEncodeDecode( 3, radix_mult, "Third");
}
void CheckGood(SerializedAnnotation ser, AnnotationId id,
               const std::vector<int>& radix_mult) {
    auto back = DecodeAnnotationSerialization( ser, radix_mult);
    EXPECT_EQ(back, id) << "Good";
}
void CheckBad(SerializedAnnotation ser,
              const std::vector<int>& radix_mult) {
    auto back = DecodeAnnotationSerialization( ser, radix_mult);
    EXPECT_EQ(back, kAnnotationError) << "Bad";
}
TEST(Annotation, Decode) {
    auto radix_mult = TestSetup( {2, 3, 4} , {3, 12, 60} );
    CheckBad( {1}, radix_mult);
    CheckBad( {5<<3, 0 }, radix_mult);
    CheckBad( {1<<3, 0 }, radix_mult);
    CheckBad( {1<<3, 8 }, radix_mult);
    CheckBad( {1<<3, 1, 2<<3, 2, 3<<3}, radix_mult);
    CheckBad( {1<<3, 1, 2<<3, 2, 3<<3, 3, 0}, radix_mult);
    CheckGood( {1<<3, 1 }, 1, radix_mult);
    CheckGood( {1<<3, 2 }, 2, radix_mult);
    CheckGood( {1<<3, 1, 2<<3, 1}, 4, radix_mult);
    CheckGood( {1<<3, 2, 2<<3, 3, 3<<3, 4}, 59, radix_mult);
}