diff options
author | Josh Haberman <jhaberman@gmail.com> | 2013-10-24 12:43:19 -0700 |
---|---|---|
committer | Josh Haberman <jhaberman@gmail.com> | 2013-10-24 12:43:19 -0700 |
commit | 26d98ca94f2f049e8767b4a9a33d185a3d7ea0fd (patch) | |
tree | 340bcf495f06ed05c9f3fb423f210caf4edce2b1 /tests/test_cpp.cc | |
parent | 61109fca1f967771c21dc7184aee35f3b439c577 (diff) |
Merge from Google-internal development:
- rewritten decoder; interpreted decoder is bytecode-based,
JIT decoder no longer falls back to the interpreter.
- C++ improvements: C++11-compatible iterators, upb::reffed_ptr
for RAII refcounting, better upcast/downcast support.
- removed the gross upb_value abstraction from public upb.h.
Diffstat (limited to 'tests/test_cpp.cc')
-rw-r--r-- | tests/test_cpp.cc | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/tests/test_cpp.cc b/tests/test_cpp.cc index db2337e..2b122a3 100644 --- a/tests/test_cpp.cc +++ b/tests/test_cpp.cc @@ -10,6 +10,7 @@ #include <stdio.h> #include <string.h> #include <iostream> +#include <set> #include "upb/def.h" #include "upb/descriptor/reader.h" #include "upb/handlers.h" @@ -18,6 +19,36 @@ #include "upb_test.h" #include "upb/upb.h" +template <class T> +void AssertInsert(T* const container, const typename T::value_type& val) { + bool inserted = container->insert(val).second; + ASSERT(inserted); +} + +static void TestCasts1() { + const upb::MessageDef* md = upb::MessageDef::New(&md); + const upb::Def* def = md->Upcast(); + 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); + + const upb::EnumDef* ed = upb::dyn_cast<const upb::EnumDef*>(def); + ASSERT(!ed); + + md->Unref(&md); +} + +static void TestCasts2() { + // Test non-const -> const cast. + upb::MessageDef* md = upb::MessageDef::New(&md); + upb::Def* def = md->Upcast(); + const upb::MessageDef* const_md = upb::down_cast<const upb::MessageDef*>(def); + ASSERT(const_md == md); + md->Unref(&md); +} + static void TestSymbolTable(const char *descriptor_file) { upb::SymbolTable *s = upb::SymbolTable::New(&s); upb::Status status; @@ -25,9 +56,22 @@ static void TestSymbolTable(const char *descriptor_file) { std::cerr << "Couldn't load descriptor: " << status.GetString(); exit(1); } - const upb::MessageDef *md = s->LookupMessage("A", &md); + const upb::MessageDef* md = s->LookupMessage("C", &md); ASSERT(md); + // 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) { + AssertInsert(&fielddefs, f); + ASSERT(f->containing_type() == md); + } + ASSERT(fielddefs.size() == md->field_count()); +#endif + s->Unref(&s); md->Unref(&md); } @@ -40,6 +84,8 @@ int run_tests(int argc, char *argv[]) { return 1; } TestSymbolTable(argv[1]); + TestCasts1(); + TestCasts2(); return 0; } |