diff options
Diffstat (limited to 'tests/test_cpp.cc')
-rw-r--r-- | tests/test_cpp.cc | 746 |
1 files changed, 209 insertions, 537 deletions
diff --git a/tests/test_cpp.cc b/tests/test_cpp.cc index 2cd9802..ed8e9c4 100644 --- a/tests/test_cpp.cc +++ b/tests/test_cpp.cc @@ -11,13 +11,13 @@ #include <set> #include <sstream> +#include "tests/test_cpp.upbdefs.h" #include "upb/def.h" -#include "upb/descriptor/reader.h" #include "upb/handlers.h" #include "upb/pb/decoder.h" -#include "upb/pb/glue.h" -#include "upb_test.h" +#include "upb/pb/textprinter.h" #include "upb/upb.h" +#include "upb_test.h" template <class T> void AssertInsert(T* const container, const typename T::value_type& val) { @@ -25,182 +25,6 @@ void AssertInsert(T* const container, const typename T::value_type& val) { ASSERT(inserted); } -static void TestCastsUpDown() { - upb::reffed_ptr<const upb::MessageDef> reffed_md(upb::MessageDef::New()); - const upb::MessageDef* md = reffed_md.get(); - - // Upcast to reffed_ptr implicitly. - upb::reffed_ptr<const upb::Def> reffed_def = reffed_md; - ASSERT(reffed_def.get() == upb::upcast(reffed_md.get())); - - // Upcast to raw pointer must be explicit. - const upb::Def* def = upb::upcast(md); - ASSERT(def == reffed_def.get()); - const upb::Def* def2 = upb::upcast(reffed_md.get()); - ASSERT(def2 == reffed_def.get()); - - // Downcast/dyncast of raw pointer uses upb::down_cast/upb::dyn_cast. - const upb::MessageDef* md2 = upb::down_cast<const upb::MessageDef*>(def); - const upb::MessageDef* md3 = upb::dyn_cast<const upb::MessageDef*>(def); - ASSERT(md == md2); - ASSERT(md == md3); - - // Downcast/dyncast of reffed_ptr uses down_cast/dyn_cast members. - upb::reffed_ptr<const upb::MessageDef> md4( - reffed_def.down_cast<const upb::MessageDef>()); - upb::reffed_ptr<const upb::MessageDef> md5( - reffed_def.dyn_cast<const upb::MessageDef>()); - ASSERT(md == md4.get()); - ASSERT(md == md5.get()); - - // Failed dyncast returns NULL. - ASSERT(upb::dyn_cast<const upb::EnumDef*>(def) == NULL); - ASSERT(reffed_def.dyn_cast<const upb::EnumDef>().get() == NULL); -} - -static void TestCastsConst0() { - // Should clean up properly even if it is not assigned to anything. - upb::MessageDef::New(); -} - -static void TestCastsConst1() { - // Test reffed mutable -> reffed mutable construction/assignment. - upb::reffed_ptr<upb::MessageDef> md(upb::MessageDef::New()); - upb::MessageDef *md2 = md.get(); - md = upb::MessageDef::New(); - ASSERT(md.get()); - ASSERT(md.get() != md2); -} - -static void TestCastsConst2() { - // Test reffed mutable -> reffed mutable upcast construction/assignment. - upb::reffed_ptr<upb::MessageDef> md(upb::MessageDef::New()); - upb::reffed_ptr<upb::Def> def = md; - ASSERT(upb::upcast(md.get()) == def.get()); - def = md; - ASSERT(upb::upcast(md.get()) == def.get()); -} - -static void TestCastsConst3() { - // Test reffed mutable -> reffed mutable downcast. - upb::reffed_ptr<upb::Def> def(upb::MessageDef::New()); - upb::reffed_ptr<upb::MessageDef> md = def.down_cast<upb::MessageDef>(); - ASSERT(upb::upcast(md.get()) == def.get()); -} - -static void TestCastsConst4() { - // Test reffed mutable -> reffed mutable dyncast. - upb::reffed_ptr<upb::Def> def(upb::MessageDef::New()); - upb::reffed_ptr<upb::MessageDef> md = def.dyn_cast<upb::MessageDef>(); - ASSERT(upb::upcast(md.get()) == def.get()); -} - -static void TestCastsConst5() { - // Test reffed mutable -> reffed const construction/assignment. - upb::reffed_ptr<const upb::MessageDef> md(upb::MessageDef::New()); - const upb::MessageDef *md2 = md.get(); - md = upb::MessageDef::New(); - ASSERT(md.get()); - ASSERT(md.get() != md2); -} - -static void TestCastsConst6() { - // Test reffed mutable -> reffed const upcast construction/assignment. - upb::reffed_ptr<upb::MessageDef> md(upb::MessageDef::New()); - upb::reffed_ptr<const upb::Def> def = md; - ASSERT(upb::upcast(md.get()) == def.get()); - def = md; - ASSERT(upb::upcast(md.get()) == def.get()); -} - -static void TestCastsConst7() { - // Test reffed mutable -> reffed const downcast. - upb::reffed_ptr<upb::Def> def(upb::MessageDef::New()); - upb::reffed_ptr<const upb::MessageDef> md = - def.down_cast<const upb::MessageDef>(); - ASSERT(upb::upcast(md.get()) == def.get()); -} - -static void TestCastsConst8() { - // Test reffed mutable -> reffed const dyncast. - upb::reffed_ptr<upb::Def> def(upb::MessageDef::New()); - upb::reffed_ptr<const upb::MessageDef> md = - def.dyn_cast<const upb::MessageDef>(); - ASSERT(upb::upcast(md.get()) == def.get()); -} - -static void TestCastsConst9() { - // Test plain mutable -> plain mutable upcast - upb::reffed_ptr<upb::MessageDef> md(upb::MessageDef::New()); - upb::Def* def = upb::upcast(md.get()); - ASSERT(upb::down_cast<upb::MessageDef*>(def) == md.get()); -} - -static void TestCastsConst10() { - // Test plain const -> plain const upcast - upb::reffed_ptr<const upb::MessageDef> md(upb::MessageDef::New()); - const upb::Def* def = upb::upcast(md.get()); - ASSERT(upb::down_cast<const upb::MessageDef*>(def) == md.get()); -} - -static void TestSymbolTable(const char *descriptor_file) { - upb::Status status; - std::ifstream file_in(descriptor_file, std::ios::binary); - std::string descriptor((std::istreambuf_iterator<char>(file_in)), - (std::istreambuf_iterator<char>())); - std::vector<upb::reffed_ptr<upb::FileDef> > files; - if (!upb::LoadDescriptor(descriptor, &status, &files)) { - std::cerr << "Couldn't load descriptor: " << status.error_message(); - exit(1); - } - - upb::SymbolTable* s = upb::SymbolTable::New(); - - for (size_t i = 0; i < files.size(); i++) { - ASSERT(s->AddFile(files[i].get(), &status)); - } - - upb::reffed_ptr<const upb::MessageDef> md(s->LookupMessage("C")); - ASSERT(md.get()); - - // We want a def that satisfies this to test iteration. - ASSERT(md->field_count() > 1); - -#ifdef UPB_CXX11 - // Test range-based for. - std::set<const upb::FieldDef*> fielddefs; - for (const upb::FieldDef* f : md.get()->fields()) { - AssertInsert(&fielddefs, f); - ASSERT(f->containing_type() == md.get()); - } - ASSERT(fielddefs.size() == md->field_count()); -#endif - - ASSERT(md.get()); - upb::SymbolTable::Free(s); -} - -static void TestCasts1() { - upb::reffed_ptr<const upb::MessageDef> md(upb::MessageDef::New()); - const upb::Def* def = upb::upcast(md.get()); - const upb::MessageDef* md2 = upb::down_cast<const upb::MessageDef*>(def); - const upb::MessageDef* md3 = upb::dyn_cast<const upb::MessageDef*>(def); - - ASSERT(md.get() == md2); - ASSERT(md.get() == md3); - - const upb::EnumDef* ed = upb::dyn_cast<const upb::EnumDef*>(def); - ASSERT(!ed); -} - -static void TestCasts2() { - // Test mutable -> const cast. - upb::reffed_ptr<upb::MessageDef> md(upb::MessageDef::New()); - upb::Def* def = upb::upcast(md.get()); - const upb::MessageDef* const_md = upb::down_cast<const upb::MessageDef*>(def); - ASSERT(const_md == md.get()); -} - // // Tests for registering and calling handlers in all their variants. // This test code is very repetitive because we have to declare each @@ -225,20 +49,20 @@ static const int kExpectedHandlerData = 1232323; class StringBufTesterBase { public: - static const upb::FieldDef::Type kFieldType = UPB_TYPE_STRING; + static const int kFieldNumber = 3; StringBufTesterBase() : seen_(false), handler_data_val_(0) {} - void CallAndVerify(upb::Sink* sink, const upb::FieldDef* f) { - upb::Handlers::Selector start; - ASSERT(upb::Handlers::GetSelector(f, UPB_HANDLER_STARTSTR, &start)); - upb::Handlers::Selector str; - ASSERT(upb::Handlers::GetSelector(f, UPB_HANDLER_STRING, &str)); + void CallAndVerify(upb::Sink sink, upb::FieldDefPtr f) { + upb_selector_t start; + ASSERT(upb_handlers_getselector(f.ptr(), UPB_HANDLER_STARTSTR, &start)); + upb_selector_t str; + ASSERT(upb_handlers_getselector(f.ptr(), UPB_HANDLER_STRING, &str)); ASSERT(!seen_); upb::Sink sub; - sink->StartMessage(); - sink->StartString(start, 0, &sub); + sink.StartMessage(); + sink.StartString(start, 0, &sub); size_t ret = sub.PutStringBuffer(str, &buf_, 5, &handle_); ASSERT(seen_); ASSERT(len_ == 5); @@ -251,7 +75,7 @@ class StringBufTesterBase { int handler_data_val_; size_t len_; char buf_; - upb::BufferHandle handle_; + upb_bufhandle handle_; }; // Test 8 combinations of: @@ -268,9 +92,9 @@ class StringBufTesterVoidMethodNoHandlerDataNoHandle : public StringBufTesterBase { public: typedef StringBufTesterVoidMethodNoHandlerDataNoHandle ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStringHandler(f, UpbMakeHandler(&ME::Handler))); + ASSERT(h.SetStringHandler(f, UpbMakeHandler(&ME::Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -286,14 +110,14 @@ class StringBufTesterVoidMethodNoHandlerDataWithHandle : public StringBufTesterBase { public: typedef StringBufTesterVoidMethodNoHandlerDataWithHandle ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStringHandler(f, UpbMakeHandler(&ME::Handler))); + ASSERT(h.SetStringHandler(f, UpbMakeHandler(&ME::Handler))); handler_data_val_ = kExpectedHandlerData; } private: - void Handler(const char *buf, size_t len, const upb::BufferHandle* handle) { + void Handler(const char *buf, size_t len, const upb_bufhandle* handle) { ASSERT(buf == &buf_); ASSERT(handle == &handle_); seen_ = true; @@ -305,9 +129,9 @@ class StringBufTesterVoidMethodWithHandlerDataNoHandle : public StringBufTesterBase { public: typedef StringBufTesterVoidMethodWithHandlerDataNoHandle ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStringHandler( + ASSERT(h.SetStringHandler( f, UpbBind(&ME::Handler, new int(kExpectedHandlerData)))); } @@ -324,15 +148,15 @@ class StringBufTesterVoidMethodWithHandlerDataWithHandle : public StringBufTesterBase { public: typedef StringBufTesterVoidMethodWithHandlerDataWithHandle ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStringHandler( + ASSERT(h.SetStringHandler( f, UpbBind(&ME::Handler, new int(kExpectedHandlerData)))); } private: void Handler(const int* hd, const char* buf, size_t len, - const upb::BufferHandle* handle) { + const upb_bufhandle* handle) { ASSERT(buf == &buf_); ASSERT(handle == &handle_); handler_data_val_ = *hd; @@ -345,9 +169,9 @@ class StringBufTesterVoidFunctionNoHandlerDataNoHandle : public StringBufTesterBase { public: typedef StringBufTesterVoidFunctionNoHandlerDataNoHandle ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStringHandler(f, UpbMakeHandler(&ME::Handler))); + ASSERT(h.SetStringHandler(f, UpbMakeHandler(&ME::Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -363,15 +187,15 @@ class StringBufTesterVoidFunctionNoHandlerDataWithHandle : public StringBufTesterBase { public: typedef StringBufTesterVoidFunctionNoHandlerDataWithHandle ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStringHandler(f, UpbMakeHandler(&ME::Handler))); + ASSERT(h.SetStringHandler(f, UpbMakeHandler(&ME::Handler))); handler_data_val_ = kExpectedHandlerData; } private: static void Handler(ME* t, const char* buf, size_t len, - const upb::BufferHandle* handle) { + const upb_bufhandle* handle) { ASSERT(buf == &t->buf_); ASSERT(handle == &t->handle_); t->seen_ = true; @@ -383,9 +207,9 @@ class StringBufTesterVoidFunctionWithHandlerDataNoHandle : public StringBufTesterBase { public: typedef StringBufTesterVoidFunctionWithHandlerDataNoHandle ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStringHandler( + ASSERT(h.SetStringHandler( f, UpbBind(&ME::Handler, new int(kExpectedHandlerData)))); } @@ -402,15 +226,15 @@ class StringBufTesterVoidFunctionWithHandlerDataWithHandle : public StringBufTesterBase { public: typedef StringBufTesterVoidFunctionWithHandlerDataWithHandle ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStringHandler( + ASSERT(h.SetStringHandler( f, UpbBind(&ME::Handler, new int(kExpectedHandlerData)))); } private: static void Handler(ME* t, const int* hd, const char* buf, size_t len, - const upb::BufferHandle* handle) { + const upb_bufhandle* handle) { ASSERT(buf == &t->buf_); ASSERT(handle == &t->handle_); t->handler_data_val_ = *hd; @@ -423,9 +247,9 @@ class StringBufTesterSizeTMethodNoHandlerDataNoHandle : public StringBufTesterBase { public: typedef StringBufTesterSizeTMethodNoHandlerDataNoHandle ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStringHandler(f, UpbMakeHandler(&ME::Handler))); + ASSERT(h.SetStringHandler(f, UpbMakeHandler(&ME::Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -442,9 +266,9 @@ class StringBufTesterBoolMethodNoHandlerDataNoHandle : public StringBufTesterBase { public: typedef StringBufTesterBoolMethodNoHandlerDataNoHandle ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStringHandler(f, UpbMakeHandler(&ME::Handler))); + ASSERT(h.SetStringHandler(f, UpbMakeHandler(&ME::Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -461,14 +285,14 @@ class StartMsgTesterBase { public: // We don't need the FieldDef it will create, but the test harness still // requires that we provide one. - static const upb::FieldDef::Type kFieldType = UPB_TYPE_STRING; + static const int kFieldNumber = 3; StartMsgTesterBase() : seen_(false), handler_data_val_(0) {} - void CallAndVerify(upb::Sink* sink, const upb::FieldDef* f) { + void CallAndVerify(upb::Sink sink, upb::FieldDefPtr f) { UPB_UNUSED(f); ASSERT(!seen_); - sink->StartMessage(); + sink.StartMessage(); ASSERT(seen_); ASSERT(handler_data_val_ == kExpectedHandlerData); } @@ -484,9 +308,9 @@ class StartMsgTesterBase { class StartMsgTesterVoidFunctionNoHandlerData : public StartMsgTesterBase { public: typedef StartMsgTesterVoidFunctionNoHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStartMessageHandler(UpbMakeHandler(&Handler))); + ASSERT(h.SetStartMessageHandler(UpbMakeHandler(&Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -500,9 +324,9 @@ class StartMsgTesterVoidFunctionNoHandlerData : public StartMsgTesterBase { class StartMsgTesterBoolFunctionNoHandlerData : public StartMsgTesterBase { public: typedef StartMsgTesterBoolFunctionNoHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStartMessageHandler(UpbMakeHandler(&Handler))); + ASSERT(h.SetStartMessageHandler(UpbMakeHandler(&Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -516,9 +340,9 @@ class StartMsgTesterBoolFunctionNoHandlerData : public StartMsgTesterBase { class StartMsgTesterVoidMethodNoHandlerData : public StartMsgTesterBase { public: typedef StartMsgTesterVoidMethodNoHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStartMessageHandler(UpbMakeHandler(&ME::Handler))); + ASSERT(h.SetStartMessageHandler(UpbMakeHandler(&ME::Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -531,9 +355,9 @@ class StartMsgTesterVoidMethodNoHandlerData : public StartMsgTesterBase { class StartMsgTesterBoolMethodNoHandlerData : public StartMsgTesterBase { public: typedef StartMsgTesterBoolMethodNoHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStartMessageHandler(UpbMakeHandler(&ME::Handler))); + ASSERT(h.SetStartMessageHandler(UpbMakeHandler(&ME::Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -547,9 +371,9 @@ class StartMsgTesterBoolMethodNoHandlerData : public StartMsgTesterBase { class StartMsgTesterVoidFunctionWithHandlerData : public StartMsgTesterBase { public: typedef StartMsgTesterVoidFunctionWithHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStartMessageHandler( + ASSERT(h.SetStartMessageHandler( UpbBind(&Handler, new int(kExpectedHandlerData)))); } @@ -563,9 +387,9 @@ class StartMsgTesterVoidFunctionWithHandlerData : public StartMsgTesterBase { class StartMsgTesterBoolFunctionWithHandlerData : public StartMsgTesterBase { public: typedef StartMsgTesterBoolFunctionWithHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStartMessageHandler( + ASSERT(h.SetStartMessageHandler( UpbBind(&Handler, new int(kExpectedHandlerData)))); } @@ -580,9 +404,9 @@ class StartMsgTesterBoolFunctionWithHandlerData : public StartMsgTesterBase { class StartMsgTesterVoidMethodWithHandlerData : public StartMsgTesterBase { public: typedef StartMsgTesterVoidMethodWithHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStartMessageHandler( + ASSERT(h.SetStartMessageHandler( UpbBind(&ME::Handler, new int(kExpectedHandlerData)))); } @@ -596,9 +420,9 @@ class StartMsgTesterVoidMethodWithHandlerData : public StartMsgTesterBase { class StartMsgTesterBoolMethodWithHandlerData : public StartMsgTesterBase { public: typedef StartMsgTesterBoolMethodWithHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { UPB_UNUSED(f); - ASSERT(h->SetStartMessageHandler( + ASSERT(h.SetStartMessageHandler( UpbBind(&ME::Handler, new int(kExpectedHandlerData)))); } @@ -612,16 +436,16 @@ class StartMsgTesterBoolMethodWithHandlerData : public StartMsgTesterBase { class Int32ValueTesterBase { public: - static const upb::FieldDef::Type kFieldType = UPB_TYPE_INT32; + static const int kFieldNumber = 1; Int32ValueTesterBase() : seen_(false), val_(0), handler_data_val_(0) {} - void CallAndVerify(upb::Sink* sink, const upb::FieldDef* f) { - upb::Handlers::Selector s; - ASSERT(upb::Handlers::GetSelector(f, UPB_HANDLER_INT32, &s)); + void CallAndVerify(upb::Sink sink, upb::FieldDefPtr f) { + upb_selector_t s; + ASSERT(upb_handlers_getselector(f.ptr(), UPB_HANDLER_INT32, &s)); ASSERT(!seen_); - sink->PutInt32(s, 5); + sink.PutInt32(s, 5); ASSERT(seen_); ASSERT(handler_data_val_ == kExpectedHandlerData); ASSERT(val_ == 5); @@ -640,8 +464,8 @@ class ValueTesterInt32VoidFunctionNoHandlerData : public Int32ValueTesterBase { public: typedef ValueTesterInt32VoidFunctionNoHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { - ASSERT(h->SetInt32Handler(f, UpbMakeHandler(&Handler))); + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { + ASSERT(h.SetInt32Handler(f, UpbMakeHandler(&Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -656,8 +480,8 @@ class ValueTesterInt32BoolFunctionNoHandlerData : public Int32ValueTesterBase { public: typedef ValueTesterInt32BoolFunctionNoHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { - ASSERT(h->SetInt32Handler(f, UpbMakeHandler(&Handler))); + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { + ASSERT(h.SetInt32Handler(f, UpbMakeHandler(&Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -672,8 +496,8 @@ class ValueTesterInt32BoolFunctionNoHandlerData class ValueTesterInt32VoidMethodNoHandlerData : public Int32ValueTesterBase { public: typedef ValueTesterInt32VoidMethodNoHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { - ASSERT(h->SetInt32Handler(f, UpbMakeHandler(&ME::Handler))); + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { + ASSERT(h.SetInt32Handler(f, UpbMakeHandler(&ME::Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -687,8 +511,8 @@ class ValueTesterInt32VoidMethodNoHandlerData : public Int32ValueTesterBase { class ValueTesterInt32BoolMethodNoHandlerData : public Int32ValueTesterBase { public: typedef ValueTesterInt32BoolMethodNoHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { - ASSERT(h->SetInt32Handler(f, UpbMakeHandler(&ME::Handler))); + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { + ASSERT(h.SetInt32Handler(f, UpbMakeHandler(&ME::Handler))); handler_data_val_ = kExpectedHandlerData; } @@ -704,8 +528,8 @@ class ValueTesterInt32VoidFunctionWithHandlerData : public Int32ValueTesterBase { public: typedef ValueTesterInt32VoidFunctionWithHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { - ASSERT(h->SetInt32Handler( + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { + ASSERT(h.SetInt32Handler( f, UpbBind(&Handler, new int(kExpectedHandlerData)))); } @@ -721,8 +545,8 @@ class ValueTesterInt32BoolFunctionWithHandlerData : public Int32ValueTesterBase { public: typedef ValueTesterInt32BoolFunctionWithHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { - ASSERT(h->SetInt32Handler( + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { + ASSERT(h.SetInt32Handler( f, UpbBind(&Handler, new int(kExpectedHandlerData)))); } @@ -738,8 +562,8 @@ class ValueTesterInt32BoolFunctionWithHandlerData class ValueTesterInt32VoidMethodWithHandlerData : public Int32ValueTesterBase { public: typedef ValueTesterInt32VoidMethodWithHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { - ASSERT(h->SetInt32Handler( + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { + ASSERT(h.SetInt32Handler( f, UpbBind(&ME::Handler, new int(kExpectedHandlerData)))); } @@ -754,8 +578,8 @@ class ValueTesterInt32VoidMethodWithHandlerData : public Int32ValueTesterBase { class ValueTesterInt32BoolMethodWithHandlerData : public Int32ValueTesterBase { public: typedef ValueTesterInt32BoolMethodWithHandlerData ME; - void Register(upb::Handlers* h, const upb::FieldDef* f) { - ASSERT(h->SetInt32Handler( + void Register(upb::HandlersPtr h, upb::FieldDefPtr f) { + ASSERT(h.SetInt32Handler( f, UpbBind(&ME::Handler, new int(kExpectedHandlerData)))); } @@ -769,22 +593,28 @@ class ValueTesterInt32BoolMethodWithHandlerData : public Int32ValueTesterBase { }; template <class T> +void RegisterHandlers(const void* closure, upb::Handlers* h_ptr) { + T* tester = const_cast<T*>(static_cast<const T*>(closure)); + upb::HandlersPtr h(h_ptr); + upb::FieldDefPtr f = h.message_def().FindFieldByNumber(T::kFieldNumber); + ASSERT(f); + tester->Register(h, f); +} + +template <class T> void TestHandler() { - upb::reffed_ptr<upb::MessageDef> md(upb::MessageDef::New()); - upb::reffed_ptr<upb::FieldDef> f(upb::FieldDef::New()); - f->set_type(T::kFieldType); - ASSERT(f->set_name("test", NULL)); - ASSERT(f->set_number(1, NULL)); - ASSERT(md->AddField(f, NULL)); - ASSERT(md->Freeze(NULL)); - - upb::reffed_ptr<upb::Handlers> h(upb::Handlers::New(md.get())); T tester; - tester.Register(h.get(), f.get()); - ASSERT(h->Freeze(NULL)); + upb::SymbolTable symtab; + upb::HandlerCache cache(&RegisterHandlers<T>, &tester); + upb::MessageDefPtr md(upb_test_TestMessage_getmsgdef(symtab.ptr())); + ASSERT(md); + upb::FieldDefPtr f = md.FindFieldByNumber(T::kFieldNumber); + ASSERT(f); - upb::Sink sink(h.get(), &tester); - tester.CallAndVerify(&sink, f.get()); + const upb::Handlers* h = cache.Get(md); + + upb::Sink sink(h, &tester); + tester.CallAndVerify(sink, f); } class T1 {}; @@ -843,247 +673,186 @@ void DoNothingStringBufHandler(C* closure, const char *buf, size_t len) { } template <class C> -void DoNothingEndMessageHandler(C* closure, upb::Status *status) { +void DoNothingEndMessageHandler(C* closure, upb_status *status) { UPB_UNUSED(closure); UPB_UNUSED(status); } -void TestMismatchedTypes() { - // First create a schema for our test. - upb::reffed_ptr<upb::MessageDef> md(upb::MessageDef::New()); - - upb::reffed_ptr<upb::FieldDef> f(upb::FieldDef::New()); - f->set_type(UPB_TYPE_INT32); - ASSERT(f->set_name("i32", NULL)); - ASSERT(f->set_number(1, NULL)); - ASSERT(md->AddField(f, NULL)); - const upb::FieldDef* i32 = f.get(); - - f = upb::FieldDef::New(); - f->set_type(UPB_TYPE_INT32); - ASSERT(f->set_name("r_i32", NULL)); - ASSERT(f->set_number(2, NULL)); - f->set_label(UPB_LABEL_REPEATED); - ASSERT(md->AddField(f, NULL)); - const upb::FieldDef* r_i32 = f.get(); - - f = upb::FieldDef::New(); - f->set_type(UPB_TYPE_STRING); - ASSERT(f->set_name("str", NULL)); - ASSERT(f->set_number(3, NULL)); - ASSERT(md->AddField(f, NULL)); - const upb::FieldDef* str = f.get(); - - f = upb::FieldDef::New(); - f->set_type(UPB_TYPE_STRING); - ASSERT(f->set_name("r_str", NULL)); - ASSERT(f->set_number(4, NULL)); - f->set_label(UPB_LABEL_REPEATED); - ASSERT(md->AddField(f, NULL)); - const upb::FieldDef* r_str = f.get(); - - f = upb::FieldDef::New(); - f->set_type(UPB_TYPE_MESSAGE); - ASSERT(f->set_name("msg", NULL)); - ASSERT(f->set_number(5, NULL)); - ASSERT(f->set_message_subdef(md.get(), NULL)); - ASSERT(md->AddField(f, NULL)); - const upb::FieldDef* msg = f.get(); - - f = upb::FieldDef::New(); - f->set_type(UPB_TYPE_MESSAGE); - ASSERT(f->set_name("r_msg", NULL)); - ASSERT(f->set_number(6, NULL)); - ASSERT(f->set_message_subdef(md.get(), NULL)); - f->set_label(UPB_LABEL_REPEATED); - ASSERT(md->AddField(f, NULL)); - const upb::FieldDef* r_msg = f.get(); - - ASSERT(md->Freeze(NULL)); - - // Now test the type-checking in handler registration. - upb::reffed_ptr<upb::Handlers> h(upb::Handlers::New(md.get())); +void RegisterMismatchedTypes(const void* closure, upb::Handlers* h_ptr) { + upb::HandlersPtr h(h_ptr); + + upb::MessageDefPtr md(h.message_def()); + ASSERT(md); + upb::FieldDefPtr i32 = md.FindFieldByName("i32"); + upb::FieldDefPtr r_i32 = md.FindFieldByName("r_i32"); + upb::FieldDefPtr str = md.FindFieldByName("str"); + upb::FieldDefPtr r_str = md.FindFieldByName("r_str"); + upb::FieldDefPtr msg = md.FindFieldByName("msg"); + upb::FieldDefPtr r_msg = md.FindFieldByName("r_msg"); + ASSERT(i32); + ASSERT(r_i32); + ASSERT(str); + ASSERT(r_str); + ASSERT(msg); + ASSERT(r_msg); // Establish T1 as the top-level closure type. - ASSERT(h->SetInt32Handler(i32, UpbMakeHandler(DoNothingInt32Handler<T1>))); + ASSERT(h.SetInt32Handler(i32, UpbMakeHandler(DoNothingInt32Handler<T1>))); // Now any other attempt to set another handler with T2 as the top-level // closure should fail. But setting these same handlers with T1 as the // top-level closure will succeed. - ASSERT(!h->SetStartMessageHandler(UpbMakeHandler(DoNothingHandler<T2>))); - ASSERT(h->SetStartMessageHandler(UpbMakeHandler(DoNothingHandler<T1>))); + ASSERT(!h.SetStartMessageHandler(UpbMakeHandler(DoNothingHandler<T2>))); + ASSERT(h.SetStartMessageHandler(UpbMakeHandler(DoNothingHandler<T1>))); ASSERT( - !h->SetEndMessageHandler(UpbMakeHandler(DoNothingEndMessageHandler<T2>))); + !h.SetEndMessageHandler(UpbMakeHandler(DoNothingEndMessageHandler<T2>))); ASSERT( - h->SetEndMessageHandler(UpbMakeHandler(DoNothingEndMessageHandler<T1>))); + h.SetEndMessageHandler(UpbMakeHandler(DoNothingEndMessageHandler<T1>))); - ASSERT(!h->SetStartStringHandler( + ASSERT(!h.SetStartStringHandler( str, UpbMakeHandler(DoNothingStartHandler<T1>::String<T2>))); - ASSERT(h->SetStartStringHandler( + ASSERT(h.SetStartStringHandler( str, UpbMakeHandler(DoNothingStartHandler<T1>::String<T1>))); - ASSERT(!h->SetEndStringHandler(str, UpbMakeHandler(DoNothingHandler<T2>))); - ASSERT(h->SetEndStringHandler(str, UpbMakeHandler(DoNothingHandler<T1>))); + ASSERT(!h.SetEndStringHandler(str, UpbMakeHandler(DoNothingHandler<T2>))); + ASSERT(h.SetEndStringHandler(str, UpbMakeHandler(DoNothingHandler<T1>))); - ASSERT(!h->SetStartSubMessageHandler( + ASSERT(!h.SetStartSubMessageHandler( msg, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T2>))); - ASSERT(h->SetStartSubMessageHandler( + ASSERT(h.SetStartSubMessageHandler( msg, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T1>))); ASSERT( - !h->SetEndSubMessageHandler(msg, UpbMakeHandler(DoNothingHandler<T2>))); + !h.SetEndSubMessageHandler(msg, UpbMakeHandler(DoNothingHandler<T2>))); ASSERT( - h->SetEndSubMessageHandler(msg, UpbMakeHandler(DoNothingHandler<T1>))); + h.SetEndSubMessageHandler(msg, UpbMakeHandler(DoNothingHandler<T1>))); - ASSERT(!h->SetStartSequenceHandler( + ASSERT(!h.SetStartSequenceHandler( r_i32, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T2>))); - ASSERT(h->SetStartSequenceHandler( + ASSERT(h.SetStartSequenceHandler( r_i32, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T1>))); - ASSERT(!h->SetEndSequenceHandler( + ASSERT(!h.SetEndSequenceHandler( r_i32, UpbMakeHandler(DoNothingHandler<T2>))); - ASSERT(h->SetEndSequenceHandler( + ASSERT(h.SetEndSequenceHandler( r_i32, UpbMakeHandler(DoNothingHandler<T1>))); - ASSERT(!h->SetStartSequenceHandler( + ASSERT(!h.SetStartSequenceHandler( r_msg, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T2>))); - ASSERT(h->SetStartSequenceHandler( + ASSERT(h.SetStartSequenceHandler( r_msg, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T1>))); - ASSERT(!h->SetEndSequenceHandler( + ASSERT(!h.SetEndSequenceHandler( r_msg, UpbMakeHandler(DoNothingHandler<T2>))); - ASSERT(h->SetEndSequenceHandler( + ASSERT(h.SetEndSequenceHandler( r_msg, UpbMakeHandler(DoNothingHandler<T1>))); - ASSERT(!h->SetStartSequenceHandler( + ASSERT(!h.SetStartSequenceHandler( r_str, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T2>))); - ASSERT(h->SetStartSequenceHandler( + ASSERT(h.SetStartSequenceHandler( r_str, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T1>))); - ASSERT(!h->SetEndSequenceHandler( + ASSERT(!h.SetEndSequenceHandler( r_str, UpbMakeHandler(DoNothingHandler<T2>))); - ASSERT(h->SetEndSequenceHandler( + ASSERT(h.SetEndSequenceHandler( r_str, UpbMakeHandler(DoNothingHandler<T1>))); // By setting T1 as the return type for the Start* handlers we have // established T1 as the type of the sequence and string frames. // Setting callbacks that use T2 should fail, but T1 should succeed. ASSERT( - !h->SetStringHandler(str, UpbMakeHandler(DoNothingStringBufHandler<T2>))); + !h.SetStringHandler(str, UpbMakeHandler(DoNothingStringBufHandler<T2>))); ASSERT( - h->SetStringHandler(str, UpbMakeHandler(DoNothingStringBufHandler<T1>))); + h.SetStringHandler(str, UpbMakeHandler(DoNothingStringBufHandler<T1>))); - ASSERT(!h->SetInt32Handler(r_i32, UpbMakeHandler(DoNothingInt32Handler<T2>))); - ASSERT(h->SetInt32Handler(r_i32, UpbMakeHandler(DoNothingInt32Handler<T1>))); + ASSERT(!h.SetInt32Handler(r_i32, UpbMakeHandler(DoNothingInt32Handler<T2>))); + ASSERT(h.SetInt32Handler(r_i32, UpbMakeHandler(DoNothingInt32Handler<T1>))); - ASSERT(!h->SetStartSubMessageHandler( + ASSERT(!h.SetStartSubMessageHandler( r_msg, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T2>))); - ASSERT(h->SetStartSubMessageHandler( + ASSERT(h.SetStartSubMessageHandler( r_msg, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T1>))); - ASSERT(!h->SetEndSubMessageHandler(r_msg, + ASSERT(!h.SetEndSubMessageHandler(r_msg, UpbMakeHandler(DoNothingHandler<T2>))); - ASSERT(h->SetEndSubMessageHandler(r_msg, + ASSERT(h.SetEndSubMessageHandler(r_msg, UpbMakeHandler(DoNothingHandler<T1>))); - ASSERT(!h->SetStartStringHandler( + ASSERT(!h.SetStartStringHandler( r_str, UpbMakeHandler(DoNothingStartHandler<T1>::String<T2>))); - ASSERT(h->SetStartStringHandler( + ASSERT(h.SetStartStringHandler( r_str, UpbMakeHandler(DoNothingStartHandler<T1>::String<T1>))); ASSERT( - !h->SetEndStringHandler(r_str, UpbMakeHandler(DoNothingHandler<T2>))); - ASSERT(h->SetEndStringHandler(r_str, UpbMakeHandler(DoNothingHandler<T1>))); + !h.SetEndStringHandler(r_str, UpbMakeHandler(DoNothingHandler<T2>))); + ASSERT(h.SetEndStringHandler(r_str, UpbMakeHandler(DoNothingHandler<T1>))); - ASSERT(!h->SetStringHandler(r_str, + ASSERT(!h.SetStringHandler(r_str, UpbMakeHandler(DoNothingStringBufHandler<T2>))); - ASSERT(h->SetStringHandler(r_str, + ASSERT(h.SetStringHandler(r_str, UpbMakeHandler(DoNothingStringBufHandler<T1>))); +} - h->ClearError(); - ASSERT(h->Freeze(NULL)); +void RegisterMismatchedTypes2(const void* closure, upb::Handlers* h_ptr) { + upb::HandlersPtr h(h_ptr); + + upb::MessageDefPtr md(h.message_def()); + ASSERT(md); + upb::FieldDefPtr i32 = md.FindFieldByName("i32"); + upb::FieldDefPtr r_i32 = md.FindFieldByName("r_i32"); + upb::FieldDefPtr str = md.FindFieldByName("str"); + upb::FieldDefPtr r_str = md.FindFieldByName("r_str"); + upb::FieldDefPtr msg = md.FindFieldByName("msg"); + upb::FieldDefPtr r_msg = md.FindFieldByName("r_msg"); + ASSERT(i32); + ASSERT(r_i32); + ASSERT(str); + ASSERT(r_str); + ASSERT(msg); + ASSERT(r_msg); // For our second test we do the same in reverse. We directly set the type of // the frame and then observe failures at registering a Start* handler that // returns a different type. - h = upb::Handlers::New(md.get()); // First establish the type of a sequence frame directly. - ASSERT(h->SetInt32Handler(r_i32, UpbMakeHandler(DoNothingInt32Handler<T1>))); + ASSERT(h.SetInt32Handler(r_i32, UpbMakeHandler(DoNothingInt32Handler<T1>))); // Now setting a StartSequence callback that returns a different type should // fail. - ASSERT(!h->SetStartSequenceHandler( + ASSERT(!h.SetStartSequenceHandler( r_i32, UpbMakeHandler(DoNothingStartHandler<T2>::Handler<T1>))); - ASSERT(h->SetStartSequenceHandler( + ASSERT(h.SetStartSequenceHandler( r_i32, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T1>))); // Establish a string frame directly. - ASSERT(h->SetStringHandler(r_str, + ASSERT(h.SetStringHandler(r_str, UpbMakeHandler(DoNothingStringBufHandler<T1>))); // Fail setting a StartString callback that returns a different type. - ASSERT(!h->SetStartStringHandler( + ASSERT(!h.SetStartStringHandler( r_str, UpbMakeHandler(DoNothingStartHandler<T2>::String<T1>))); - ASSERT(h->SetStartStringHandler( + ASSERT(h.SetStartStringHandler( r_str, UpbMakeHandler(DoNothingStartHandler<T1>::String<T1>))); // The previous established T1 as the frame for the r_str sequence. - ASSERT(!h->SetStartSequenceHandler( + ASSERT(!h.SetStartSequenceHandler( r_str, UpbMakeHandler(DoNothingStartHandler<T2>::Handler<T1>))); - ASSERT(h->SetStartSequenceHandler( + ASSERT(h.SetStartSequenceHandler( r_str, UpbMakeHandler(DoNothingStartHandler<T1>::Handler<T1>))); +} - // Now test for this error that is not caught until freeze time: - // Change-of-closure-type implies that a StartSequence or StartString handler - // should exist to return the closure type of the inner frame but no - // StartSequence/StartString handler is registered. - - h = upb::Handlers::New(md.get()); - - // Establish T1 as top-level closure type. - ASSERT(h->SetInt32Handler(i32, UpbMakeHandler(DoNothingInt32Handler<T1>))); +void TestMismatchedTypes() { + // First create a schema for our test. + upb::SymbolTable symtab; + upb::HandlerCache handler_cache(&RegisterMismatchedTypes, nullptr); + upb::HandlerCache handler_cache2(&RegisterMismatchedTypes2, nullptr); + const upb::MessageDefPtr md(upb_test_TestMessage_getmsgdef(symtab.ptr())); - // Establish T2 as closure type of sequence frame. - ASSERT( - h->SetInt32Handler(r_i32, UpbMakeHandler(DoNothingInt32Handler<T2>))); - - // Now attempt to freeze; this should fail because a StartSequence handler - // needs to be registered that takes a T1 and returns a T2. - ASSERT(!h->Freeze(NULL)); - - // Now if we register the necessary StartSequence handler, the freezing should - // work. - ASSERT(h->SetStartSequenceHandler( - r_i32, UpbMakeHandler(DoNothingStartHandler<T2>::Handler<T1>))); - h->ClearError(); - ASSERT(h->Freeze(NULL)); - - // Test for a broken chain that is two deep. - h = upb::Handlers::New(md.get()); - - // Establish T1 as top-level closure type. - ASSERT(h->SetInt32Handler(i32, UpbMakeHandler(DoNothingInt32Handler<T1>))); - - // Establish T2 as the closure type of the string frame inside a sequence - // frame. - ASSERT(h->SetStringHandler(r_str, - UpbMakeHandler(DoNothingStringBufHandler<T2>))); - - // Now attempt to freeze; this should fail because a StartSequence or - // StartString handler needs to be registered that takes a T1 and returns a - // T2. - ASSERT(!h->Freeze(NULL)); - - // Now if we register a StartSequence handler it succeeds. - ASSERT(h->SetStartSequenceHandler( - r_str, UpbMakeHandler(DoNothingStartHandler<T2>::Handler<T1>))); - h->ClearError(); - ASSERT(h->Freeze(NULL)); - - // TODO(haberman): test that closure returned by StartSubMessage does not - // match top-level closure of sub-handlers. + // Now test the type-checking in handler registration. + handler_cache.Get(md); + handler_cache2.Get(md); } class IntIncrementer { @@ -1102,147 +871,51 @@ class IntIncrementer { int* x_; }; +void RegisterIncrementor(const void* closure, upb::Handlers* h_ptr) { + const int* x = static_cast<const int*>(closure); + upb::HandlersPtr h(h_ptr); + upb::FieldDefPtr f = h.message_def().FindFieldByName("i32"); + h.SetInt32Handler(f, UpbBind(&IntIncrementer::Handler, + new IntIncrementer(const_cast<int*>(x)))); +} void TestHandlerDataDestruction() { - upb::reffed_ptr<upb::MessageDef> md(upb::MessageDef::New()); - upb::reffed_ptr<upb::FieldDef> f(upb::FieldDef::New()); - f->set_type(UPB_TYPE_INT32); - ASSERT(f->set_name("test", NULL)); - ASSERT(f->set_number(1, NULL)); - ASSERT(md->AddField(f, NULL)); - ASSERT(md->Freeze(NULL)); - int x = 0; + { - upb::reffed_ptr<upb::Handlers> h(upb::Handlers::New(md.get())); - h->SetInt32Handler( - f.get(), UpbBind(&IntIncrementer::Handler, new IntIncrementer(&x))); + upb::SymbolTable symtab; + upb::HandlerCache cache(&RegisterIncrementor, &x); + upb::MessageDefPtr md(upb_test_TestMessage_getmsgdef(symtab.ptr())); + cache.Get(md); ASSERT(x == 1); } ASSERT(x == 0); } -void TestOneofs() { - upb::Status status; - upb::reffed_ptr<upb::MessageDef> md(upb::MessageDef::New()); - upb::reffed_ptr<upb::OneofDef> o(upb::OneofDef::New()); - - o->set_name("test_oneof", &status); - ASSERT(status.ok()); - - for (int i = 0; i < 5; i++) { - std::ostringstream fieldname; - fieldname << "field_" << i; - upb::reffed_ptr<upb::FieldDef> f(upb::FieldDef::New()); - f->set_name(fieldname.str(), &status); - ASSERT(status.ok()); - f->set_type(UPB_TYPE_INT32); - f->set_number(i + 1, &status); - ASSERT(status.ok()); - f->set_label(UPB_LABEL_OPTIONAL); - - o->AddField(f.get(), &status); - ASSERT(status.ok()); - } - - md->AddOneof(o.get(), &status); - ASSERT(status.ok()); +void TestIteration() { + upb::SymbolTable symtab; + upb::MessageDefPtr md(upb_test_TestMessage_getmsgdef(symtab.ptr())); - int field_count = 0; - for (upb::OneofDef::iterator it = o->begin(); it != o->end(); ++it) { - upb::FieldDef* f = *it; - ASSERT(f->type() == UPB_TYPE_INT32); - field_count++; - } - ASSERT(field_count == 5); - - upb::MessageDef::oneof_iterator msg_it = md->oneof_begin(); - ASSERT(msg_it != md->oneof_end()); - ASSERT((*msg_it) == o.get()); - -#ifdef UPB_CXX11 // Test range-based for on both fields and oneofs (with the iterator adaptor). - field_count = 0; - for (auto* field : md->fields()) { + int field_count = 0; + for (auto field : md.fields()) { UPB_UNUSED(field); field_count++; } - ASSERT(field_count == 5); + ASSERT(field_count == md.field_count()); int oneof_count = 0; - for (auto* oneof : md->oneofs()) { + for (auto oneof : md.oneofs()) { UPB_UNUSED(oneof); oneof_count++; } - ASSERT(oneof_count == 1); -#endif // UPB_CXX11 - - // Test that we can add a new field to the oneof and that it becomes a member - // of the msgdef as well. - upb::reffed_ptr<upb::FieldDef> newf(upb::FieldDef::New()); - newf->set_name("new_field_10", &status); - ASSERT(status.ok()); - newf->set_number(10, &status); - ASSERT(status.ok()); - newf->set_label(UPB_LABEL_OPTIONAL); - newf->set_type(UPB_TYPE_INT32); - o->AddField(newf.get(), &status); - ASSERT(status.ok()); - ASSERT(newf->containing_type() == md.get()); - - // Test that we can add a new field to the msgdef first and then to the oneof. - upb::reffed_ptr<upb::FieldDef> newf2(upb::FieldDef::New()); - newf2->set_name("new_field_11", &status); - ASSERT(status.ok()); - newf2->set_number(11, &status); - ASSERT(status.ok()); - newf2->set_label(UPB_LABEL_OPTIONAL); - newf2->set_type(UPB_TYPE_INT32); - md->AddField(newf2.get(), &status); - ASSERT(status.ok()); - o->AddField(newf2.get(), &status); - ASSERT(status.ok()); - ASSERT(newf2->containing_oneof() == o.get()); - - // Test that we cannot add REQUIRED or REPEATED fields to the oneof. - upb::reffed_ptr<upb::FieldDef> newf3(upb::FieldDef::New()); - newf3->set_name("new_field_12", &status); - ASSERT(status.ok()); - newf3->set_number(12, &status); - ASSERT(status.ok()); - newf3->set_label(UPB_LABEL_REQUIRED); - newf3->set_type(UPB_TYPE_INT32); - o->AddField(newf3.get(), &status); - ASSERT(!status.ok()); - newf->set_label(UPB_LABEL_REPEATED); - o->AddField(newf3.get(), &status); - ASSERT(!status.ok()); + ASSERT(oneof_count == md.oneof_count()); } extern "C" { int run_tests(int argc, char *argv[]) { - if (argc < 2) { - fprintf(stderr, "Usage: test_cpp <descriptor file>\n"); - return 1; - } - TestSymbolTable(argv[1]); - TestCastsUpDown(); - TestCasts1(); - TestCasts2(); - TestCastsConst0(); - TestCastsConst1(); - TestCastsConst2(); - TestCastsConst3(); - TestCastsConst4(); - TestCastsConst5(); - TestCastsConst6(); - TestCastsConst7(); - TestCastsConst8(); - TestCastsConst9(); - TestCastsConst10(); - TestHandler<ValueTesterInt32VoidFunctionNoHandlerData>(); TestHandler<ValueTesterInt32BoolFunctionNoHandlerData>(); TestHandler<ValueTesterInt32VoidMethodNoHandlerData>(); @@ -1275,8 +948,7 @@ int run_tests(int argc, char *argv[]) { TestMismatchedTypes(); TestHandlerDataDestruction(); - - TestOneofs(); + TestIteration(); return 0; } |