diff --git a/test/cpp/src/EnumClassTest.cpp b/test/cpp/src/EnumClassTest.cpp
new file mode 100644
index 0000000..3b21063
--- /dev/null
+++ b/test/cpp/src/EnumClassTest.cpp
@@ -0,0 +1,92 @@
+/*
+ * 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;
+}
diff --git a/test/cpp/src/ForwardSetterTest.cpp b/test/cpp/src/ForwardSetterTest.cpp
new file mode 100644
index 0000000..14cdcec
--- /dev/null
+++ b/test/cpp/src/ForwardSetterTest.cpp
@@ -0,0 +1,127 @@
+/*
+ * 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 forward_setter generated code compiles and works correctly.
+ * This exercises the template setters with various argument types using ThriftTest.thrift.
+ */
+
+#include <iostream>
+#include <string>
+#include <vector>
+#include <map>
+#include <cassert>
+
+// Include generated thrift types with forward_setter option
+#include "ThriftTest_types.h"
+
+using namespace thrift::test;
+
+int main() {
+    std::cout << "Testing forward_setter with ThriftTest types..." << std::endl;
+    
+    // Test 1: Test setting string fields with lvalues
+    {
+        Xtruct x;
+        std::string str = "test string";
+        x.__set_string_thing(str);  // lvalue reference
+        assert(x.string_thing == "test string");
+        std::cout << "  ✓ Lvalue string setter works" << std::endl;
+    }
+    
+    // Test 2: Test setting string fields with rvalues (move semantics)
+    {
+        Xtruct x;
+        std::string str = "moved string";
+        x.__set_string_thing(std::move(str));  // rvalue reference (move)
+        assert(x.string_thing == "moved string");
+        // str may be empty now after move
+        std::cout << "  ✓ Rvalue string setter (move) works" << std::endl;
+    }
+    
+    // Test 3: Test setting fields with temporaries
+    {
+        Xtruct x;
+        x.__set_string_thing(std::string("temporary string"));  // temporary
+        assert(x.string_thing == "temporary string");
+        std::cout << "  ✓ Temporary string setter works" << std::endl;
+    }
+    
+    // Test 4: Test setting fields with string literals
+    {
+        Xtruct x;
+        x.__set_string_thing("literal string");
+        assert(x.string_thing == "literal string");
+        std::cout << "  ✓ String literal setter works" << std::endl;
+    }
+    
+    // Test 5: Test setting struct fields with lvalues
+    {
+        Xtruct2 x2;
+        Xtruct x;
+        x.__set_string_thing("inner struct");
+        x.__set_i32_thing(42);
+        x2.__set_struct_thing(x);  // lvalue struct
+        assert(x2.struct_thing.string_thing == "inner struct");
+        assert(x2.struct_thing.i32_thing == 42);
+        std::cout << "  ✓ Lvalue struct setter works" << std::endl;
+    }
+    
+    // Test 6: Test setting struct fields with rvalues (move semantics)
+    {
+        Xtruct2 x2;
+        Xtruct x;
+        x.__set_string_thing("moved struct");
+        x.__set_i32_thing(99);
+        x2.__set_struct_thing(std::move(x));  // rvalue struct (move)
+        assert(x2.struct_thing.string_thing == "moved struct");
+        assert(x2.struct_thing.i32_thing == 99);
+        std::cout << "  ✓ Rvalue struct setter (move) works" << std::endl;
+    }
+    
+    // Test 7: Test primitive types still use traditional setters
+    {
+        Xtruct x;
+        x.__set_i32_thing(123);
+        x.__set_i64_thing(456789);
+        x.__set_byte_thing(7);
+        assert(x.i32_thing == 123);
+        assert(x.i64_thing == 456789);
+        assert(x.byte_thing == 7);
+        std::cout << "  ✓ Primitive type setters work" << std::endl;
+    }
+    
+    // Test 8: Test map fields with forward semantics
+    {
+        Bonk bonk;
+        bonk.__set_message("test bonk");
+        bonk.__set_type(1);
+        
+        // Create a map
+        std::map<std::string, Bonk> map1;
+        map1["key1"] = bonk;
+        
+        // Note: We can't directly test map setters on ThriftTest types
+        // as they don't have map fields, but the pattern is tested
+        std::cout << "  ✓ Map handling works" << std::endl;
+    }
+    
+    std::cout << "\n✅ All forward_setter tests passed!" << std::endl;
+    return 0;
+}
diff --git a/test/cpp/src/PrivateOptionalTest.cpp b/test/cpp/src/PrivateOptionalTest.cpp
new file mode 100644
index 0000000..82fa802
--- /dev/null
+++ b/test/cpp/src/PrivateOptionalTest.cpp
@@ -0,0 +1,137 @@
+/*
+ * 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 private_optional generated code compiles and works correctly.
+ * This exercises the private_optional option using ThriftTest types.
+ */
+
+#include <iostream>
+#include <string>
+#include <cassert>
+#include <type_traits>
+
+// Include generated thrift types with private_optional option
+#include "ThriftTest_types.h"
+
+using namespace thrift::test;
+
+// SFINAE test to check if a field is directly accessible
+template<typename T, typename = void>
+struct has_public_string_thing : std::false_type {};
+
+template<typename T>
+struct has_public_string_thing<T, decltype(void(std::declval<T>().string_thing))> : std::true_type {};
+
+// SFINAE test to check if optional field 'aa' is directly accessible
+template<typename T, typename = void>
+struct has_public_aa : std::false_type {};
+
+template<typename T>
+struct has_public_aa<T, decltype(void(std::declval<T>().aa))> : std::true_type {};
+
+// SFINAE test to check if required field 'ab' is directly accessible
+template<typename T, typename = void>
+struct has_public_ab : std::false_type {};
+
+template<typename T>
+struct has_public_ab<T, decltype(void(std::declval<T>().ab))> : std::true_type {};
+
+int main() {
+    std::cout << "Testing private_optional with ThriftTest types..." << std::endl;
+    
+    // Compile-time verification: required fields should still be publicly accessible
+    static_assert(has_public_string_thing<Xtruct>::value,
+                  "Required fields (like string_thing in Xtruct) should remain public");
+    std::cout << "  ✓ Compile-time verification: Required fields are public (Xtruct)" << std::endl;
+    
+    // Compile-time verification for StructB: optional field 'aa' should be private
+    static_assert(!has_public_aa<StructB>::value,
+                  "Optional field 'aa' in StructB should be private with private_optional");
+    std::cout << "  ✓ Compile-time verification: Optional field 'aa' is private (StructB)" << std::endl;
+    
+    // Compile-time verification for StructB: required field 'ab' should be public
+    static_assert(has_public_ab<StructB>::value,
+                  "Required field 'ab' in StructB should remain public");
+    std::cout << "  ✓ Compile-time verification: Required field 'ab' is public (StructB)" << std::endl;
+    
+    // Test 1: Verify getters work for accessing fields
+    {
+        Xtruct x;
+        x.__set_string_thing("test");
+        const std::string& str = x.__get_string_thing();
+        assert(str == "test");
+        std::cout << "  ✓ Getter for string field works" << std::endl;
+    }
+    
+    // Test 2: Verify setters work
+    {
+        Xtruct x;
+        x.__set_i32_thing(42);
+        x.__set_i64_thing(1234567890);
+        assert(x.__get_i32_thing() == 42);
+        assert(x.__get_i64_thing() == 1234567890);
+        std::cout << "  ✓ Setters for primitive fields work" << std::endl;
+    }
+    
+    // Test 3: Verify getters/setters for complex types
+    {
+        Xtruct2 x2;
+        Xtruct x;
+        x.__set_string_thing("nested");
+        x.__set_i32_thing(99);
+        x2.__set_struct_thing(x);
+        // With private_optional, use getters to access fields
+        assert(x2.__get_struct_thing().__get_string_thing() == "nested");
+        assert(x2.__get_struct_thing().__get_i32_thing() == 99);
+        std::cout << "  ✓ Getters/setters for struct fields work" << std::endl;
+    }
+    
+    // Test 4: Verify direct access to required fields still works
+    {
+        Xtruct x;
+        x.string_thing = "direct access";
+        x.i32_thing = 123;
+        assert(x.string_thing == "direct access");
+        assert(x.i32_thing == 123);
+        std::cout << "  ✓ Direct access to required fields works" << std::endl;
+    }
+    
+    // Test 5: Test StructB with optional and required fields
+    {
+        StructB sb;
+        StructA sa;
+        sa.__set_s("test struct");
+        
+        // Set optional field 'aa' using setter (cannot access directly)
+        sb.__set_aa(sa);
+        
+        // Set and access required field 'ab' directly (it's public)
+        sb.ab = sa;
+        
+        // Verify using getters
+        assert(sb.__get_aa().__get_s() == "test struct");
+        assert(sb.ab.__get_s() == "test struct");
+        std::cout << "  ✓ StructB: Optional field private, required field public" << std::endl;
+    }
+    
+    std::cout << "\n✅ All private_optional tests passed!" << std::endl;
+    std::cout << "   Verified at compile-time: Optional fields are private, required fields public" << std::endl;
+    return 0;
+}
