summaryrefslogtreecommitdiff
path: root/tests/test_cpp.cc
diff options
context:
space:
mode:
authorJosh Haberman <jhaberman@gmail.com>2013-10-24 12:43:19 -0700
committerJosh Haberman <jhaberman@gmail.com>2013-10-24 12:43:19 -0700
commit26d98ca94f2f049e8767b4a9a33d185a3d7ea0fd (patch)
tree340bcf495f06ed05c9f3fb423f210caf4edce2b1 /tests/test_cpp.cc
parent61109fca1f967771c21dc7184aee35f3b439c577 (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.cc48
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;
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback