blob: 3b210630345d426fb11fb7be9eeb0405d54d6a7f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
/**
* Test file to verify that pure_enums=enum_class generated code compiles and works correctly.
* This exercises the enum_class option using ThriftTest types.
*/
#include <iostream>
#include <cassert>
#include <type_traits>
// Include generated thrift types with enum_class option
#include "ThriftTest_types.h"
using namespace thrift::test;
int main() {
std::cout << "Testing pure_enums=enum_class with ThriftTest types..." << std::endl;
// Compile-time verification that Numberz is an enum class
static_assert(std::is_enum<Numberz>::value, "Numberz should be an enum type");
// enum class doesn't implicitly convert to int, which is a key characteristic
static_assert(!std::is_convertible<Numberz, int>::value,
"Numberz should be enum class (not implicitly convertible to int)");
std::cout << " ✓ Compile-time verification: Numberz is enum class" << std::endl;
// Test 1: Verify enum class can be used with scoped names
{
Numberz num = Numberz::ONE;
assert(static_cast<int>(num) == 1);
std::cout << " ✓ Enum class scoped access works (Numberz::ONE)" << std::endl;
}
// Test 2: Verify different enum values
{
Numberz two = Numberz::TWO;
Numberz five = Numberz::FIVE;
assert(static_cast<int>(two) == 2);
assert(static_cast<int>(five) == 5);
std::cout << " ✓ Multiple enum class values work" << std::endl;
}
// Test 3: Verify enum class comparison
{
Numberz a = Numberz::THREE;
Numberz b = Numberz::THREE;
Numberz c = Numberz::FIVE;
assert(a == b);
assert(a != c);
std::cout << " ✓ Enum class comparison works" << std::endl;
}
// Test 4: Verify enum class in switch statement
{
Numberz num = Numberz::EIGHT;
bool found = false;
switch(num) {
case Numberz::ONE:
break;
case Numberz::TWO:
break;
case Numberz::EIGHT:
found = true;
break;
default:
break;
}
assert(found);
std::cout << " ✓ Enum class in switch statements works" << std::endl;
}
std::cout << "\n✅ All pure_enums=enum_class tests passed!" << std::endl;
std::cout << " Verified at compile-time: enum class properties enforced" << std::endl;
return 0;
}