632
645
// ===================================================================
647
class StylizedFieldNamesTest : public testing::Test {
650
FileDescriptorProto file;
651
file.set_name("foo.proto");
653
AddExtensionRange(AddMessage(&file, "ExtendableMessage"), 1, 1000);
655
DescriptorProto* message = AddMessage(&file, "TestMessage");
656
AddField(message, "foo_foo", 1,
657
FieldDescriptorProto::LABEL_OPTIONAL,
658
FieldDescriptorProto::TYPE_INT32);
659
AddField(message, "FooBar", 2,
660
FieldDescriptorProto::LABEL_OPTIONAL,
661
FieldDescriptorProto::TYPE_INT32);
662
AddField(message, "fooBaz", 3,
663
FieldDescriptorProto::LABEL_OPTIONAL,
664
FieldDescriptorProto::TYPE_INT32);
665
AddField(message, "fooFoo", 4, // Camel-case conflict with foo_foo.
666
FieldDescriptorProto::LABEL_OPTIONAL,
667
FieldDescriptorProto::TYPE_INT32);
668
AddField(message, "foobar", 5, // Lower-case conflict with FooBar.
669
FieldDescriptorProto::LABEL_OPTIONAL,
670
FieldDescriptorProto::TYPE_INT32);
672
AddNestedExtension(message, "ExtendableMessage", "bar_foo", 1,
673
FieldDescriptorProto::LABEL_OPTIONAL,
674
FieldDescriptorProto::TYPE_INT32);
675
AddNestedExtension(message, "ExtendableMessage", "BarBar", 2,
676
FieldDescriptorProto::LABEL_OPTIONAL,
677
FieldDescriptorProto::TYPE_INT32);
678
AddNestedExtension(message, "ExtendableMessage", "BarBaz", 3,
679
FieldDescriptorProto::LABEL_OPTIONAL,
680
FieldDescriptorProto::TYPE_INT32);
681
AddNestedExtension(message, "ExtendableMessage", "barFoo", 4, // Conflict
682
FieldDescriptorProto::LABEL_OPTIONAL,
683
FieldDescriptorProto::TYPE_INT32);
684
AddNestedExtension(message, "ExtendableMessage", "barbar", 5, // Conflict
685
FieldDescriptorProto::LABEL_OPTIONAL,
686
FieldDescriptorProto::TYPE_INT32);
688
AddExtension(&file, "ExtendableMessage", "baz_foo", 11,
689
FieldDescriptorProto::LABEL_OPTIONAL,
690
FieldDescriptorProto::TYPE_INT32);
691
AddExtension(&file, "ExtendableMessage", "BazBar", 12,
692
FieldDescriptorProto::LABEL_OPTIONAL,
693
FieldDescriptorProto::TYPE_INT32);
694
AddExtension(&file, "ExtendableMessage", "BazBaz", 13,
695
FieldDescriptorProto::LABEL_OPTIONAL,
696
FieldDescriptorProto::TYPE_INT32);
697
AddExtension(&file, "ExtendableMessage", "bazFoo", 14, // Conflict
698
FieldDescriptorProto::LABEL_OPTIONAL,
699
FieldDescriptorProto::TYPE_INT32);
700
AddExtension(&file, "ExtendableMessage", "bazbar", 15, // Conflict
701
FieldDescriptorProto::LABEL_OPTIONAL,
702
FieldDescriptorProto::TYPE_INT32);
704
file_ = pool_.BuildFile(file);
705
ASSERT_TRUE(file_ != NULL);
706
ASSERT_EQ(2, file_->message_type_count());
707
message_ = file_->message_type(1);
708
ASSERT_EQ("TestMessage", message_->name());
709
ASSERT_EQ(5, message_->field_count());
710
ASSERT_EQ(5, message_->extension_count());
711
ASSERT_EQ(5, file_->extension_count());
714
DescriptorPool pool_;
715
const FileDescriptor* file_;
716
const Descriptor* message_;
719
TEST_F(StylizedFieldNamesTest, LowercaseName) {
720
EXPECT_EQ("foo_foo", message_->field(0)->lowercase_name());
721
EXPECT_EQ("foobar" , message_->field(1)->lowercase_name());
722
EXPECT_EQ("foobaz" , message_->field(2)->lowercase_name());
723
EXPECT_EQ("foofoo" , message_->field(3)->lowercase_name());
724
EXPECT_EQ("foobar" , message_->field(4)->lowercase_name());
726
EXPECT_EQ("bar_foo", message_->extension(0)->lowercase_name());
727
EXPECT_EQ("barbar" , message_->extension(1)->lowercase_name());
728
EXPECT_EQ("barbaz" , message_->extension(2)->lowercase_name());
729
EXPECT_EQ("barfoo" , message_->extension(3)->lowercase_name());
730
EXPECT_EQ("barbar" , message_->extension(4)->lowercase_name());
732
EXPECT_EQ("baz_foo", file_->extension(0)->lowercase_name());
733
EXPECT_EQ("bazbar" , file_->extension(1)->lowercase_name());
734
EXPECT_EQ("bazbaz" , file_->extension(2)->lowercase_name());
735
EXPECT_EQ("bazfoo" , file_->extension(3)->lowercase_name());
736
EXPECT_EQ("bazbar" , file_->extension(4)->lowercase_name());
739
TEST_F(StylizedFieldNamesTest, CamelcaseName) {
740
EXPECT_EQ("fooFoo", message_->field(0)->camelcase_name());
741
EXPECT_EQ("fooBar", message_->field(1)->camelcase_name());
742
EXPECT_EQ("fooBaz", message_->field(2)->camelcase_name());
743
EXPECT_EQ("fooFoo", message_->field(3)->camelcase_name());
744
EXPECT_EQ("foobar", message_->field(4)->camelcase_name());
746
EXPECT_EQ("barFoo", message_->extension(0)->camelcase_name());
747
EXPECT_EQ("barBar", message_->extension(1)->camelcase_name());
748
EXPECT_EQ("barBaz", message_->extension(2)->camelcase_name());
749
EXPECT_EQ("barFoo", message_->extension(3)->camelcase_name());
750
EXPECT_EQ("barbar", message_->extension(4)->camelcase_name());
752
EXPECT_EQ("bazFoo", file_->extension(0)->camelcase_name());
753
EXPECT_EQ("bazBar", file_->extension(1)->camelcase_name());
754
EXPECT_EQ("bazBaz", file_->extension(2)->camelcase_name());
755
EXPECT_EQ("bazFoo", file_->extension(3)->camelcase_name());
756
EXPECT_EQ("bazbar", file_->extension(4)->camelcase_name());
759
TEST_F(StylizedFieldNamesTest, FindByLowercaseName) {
760
EXPECT_EQ(message_->field(0),
761
message_->FindFieldByLowercaseName("foo_foo"));
762
EXPECT_EQ(message_->field(1),
763
message_->FindFieldByLowercaseName("foobar"));
764
EXPECT_EQ(message_->field(2),
765
message_->FindFieldByLowercaseName("foobaz"));
766
EXPECT_TRUE(message_->FindFieldByLowercaseName("FooBar") == NULL);
767
EXPECT_TRUE(message_->FindFieldByLowercaseName("fooBaz") == NULL);
768
EXPECT_TRUE(message_->FindFieldByLowercaseName("bar_foo") == NULL);
769
EXPECT_TRUE(message_->FindFieldByLowercaseName("nosuchfield") == NULL);
771
EXPECT_EQ(message_->extension(0),
772
message_->FindExtensionByLowercaseName("bar_foo"));
773
EXPECT_EQ(message_->extension(1),
774
message_->FindExtensionByLowercaseName("barbar"));
775
EXPECT_EQ(message_->extension(2),
776
message_->FindExtensionByLowercaseName("barbaz"));
777
EXPECT_TRUE(message_->FindExtensionByLowercaseName("BarBar") == NULL);
778
EXPECT_TRUE(message_->FindExtensionByLowercaseName("barBaz") == NULL);
779
EXPECT_TRUE(message_->FindExtensionByLowercaseName("foo_foo") == NULL);
780
EXPECT_TRUE(message_->FindExtensionByLowercaseName("nosuchfield") == NULL);
782
EXPECT_EQ(file_->extension(0),
783
file_->FindExtensionByLowercaseName("baz_foo"));
784
EXPECT_EQ(file_->extension(1),
785
file_->FindExtensionByLowercaseName("bazbar"));
786
EXPECT_EQ(file_->extension(2),
787
file_->FindExtensionByLowercaseName("bazbaz"));
788
EXPECT_TRUE(file_->FindExtensionByLowercaseName("BazBar") == NULL);
789
EXPECT_TRUE(file_->FindExtensionByLowercaseName("bazBaz") == NULL);
790
EXPECT_TRUE(file_->FindExtensionByLowercaseName("nosuchfield") == NULL);
793
TEST_F(StylizedFieldNamesTest, FindByCamelcaseName) {
794
EXPECT_EQ(message_->field(0),
795
message_->FindFieldByCamelcaseName("fooFoo"));
796
EXPECT_EQ(message_->field(1),
797
message_->FindFieldByCamelcaseName("fooBar"));
798
EXPECT_EQ(message_->field(2),
799
message_->FindFieldByCamelcaseName("fooBaz"));
800
EXPECT_TRUE(message_->FindFieldByCamelcaseName("foo_foo") == NULL);
801
EXPECT_TRUE(message_->FindFieldByCamelcaseName("FooBar") == NULL);
802
EXPECT_TRUE(message_->FindFieldByCamelcaseName("barFoo") == NULL);
803
EXPECT_TRUE(message_->FindFieldByCamelcaseName("nosuchfield") == NULL);
805
EXPECT_EQ(message_->extension(0),
806
message_->FindExtensionByCamelcaseName("barFoo"));
807
EXPECT_EQ(message_->extension(1),
808
message_->FindExtensionByCamelcaseName("barBar"));
809
EXPECT_EQ(message_->extension(2),
810
message_->FindExtensionByCamelcaseName("barBaz"));
811
EXPECT_TRUE(message_->FindExtensionByCamelcaseName("bar_foo") == NULL);
812
EXPECT_TRUE(message_->FindExtensionByCamelcaseName("BarBar") == NULL);
813
EXPECT_TRUE(message_->FindExtensionByCamelcaseName("fooFoo") == NULL);
814
EXPECT_TRUE(message_->FindExtensionByCamelcaseName("nosuchfield") == NULL);
816
EXPECT_EQ(file_->extension(0),
817
file_->FindExtensionByCamelcaseName("bazFoo"));
818
EXPECT_EQ(file_->extension(1),
819
file_->FindExtensionByCamelcaseName("bazBar"));
820
EXPECT_EQ(file_->extension(2),
821
file_->FindExtensionByCamelcaseName("bazBaz"));
822
EXPECT_TRUE(file_->FindExtensionByCamelcaseName("baz_foo") == NULL);
823
EXPECT_TRUE(file_->FindExtensionByCamelcaseName("BazBar") == NULL);
824
EXPECT_TRUE(file_->FindExtensionByCamelcaseName("nosuchfield") == NULL);
827
// ===================================================================
634
829
// Test enum descriptors.
635
830
class EnumDescriptorTest : public testing::Test {
1533
1738
EXPECT_EQ(FieldOptions::CORD, bar->options().ctype());
1741
// ===================================================================
1743
class AllowUnknownDependenciesTest : public testing::Test {
1745
virtual void SetUp() {
1746
FileDescriptorProto foo_proto, bar_proto;
1748
pool_.AllowUnknownDependencies();
1750
ASSERT_TRUE(TextFormat::ParseFromString(
1752
"dependency: 'bar.proto'"
1753
"dependency: 'baz.proto'"
1756
" field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'Bar' }"
1757
" field { name:'baz' number:2 label:LABEL_OPTIONAL type_name:'Baz' }"
1758
" field { name:'qux' number:3 label:LABEL_OPTIONAL"
1759
" type_name: '.corge.Qux'"
1762
" uninterpreted_option {"
1764
" name_part: 'grault'"
1765
" is_extension: true"
1767
" positive_int_value: 1234"
1773
ASSERT_TRUE(TextFormat::ParseFromString(
1775
"message_type { name: 'Bar' }",
1778
// Collect pointers to stuff.
1779
bar_file_ = pool_.BuildFile(bar_proto);
1780
ASSERT_TRUE(bar_file_ != NULL);
1782
ASSERT_EQ(1, bar_file_->message_type_count());
1783
bar_type_ = bar_file_->message_type(0);
1785
foo_file_ = pool_.BuildFile(foo_proto);
1786
ASSERT_TRUE(foo_file_ != NULL);
1788
ASSERT_EQ(1, foo_file_->message_type_count());
1789
foo_type_ = foo_file_->message_type(0);
1791
ASSERT_EQ(3, foo_type_->field_count());
1792
bar_field_ = foo_type_->field(0);
1793
baz_field_ = foo_type_->field(1);
1794
qux_field_ = foo_type_->field(2);
1797
const FileDescriptor* bar_file_;
1798
const Descriptor* bar_type_;
1799
const FileDescriptor* foo_file_;
1800
const Descriptor* foo_type_;
1801
const FieldDescriptor* bar_field_;
1802
const FieldDescriptor* baz_field_;
1803
const FieldDescriptor* qux_field_;
1805
DescriptorPool pool_;
1808
TEST_F(AllowUnknownDependenciesTest, PlaceholderFile) {
1809
ASSERT_EQ(2, foo_file_->dependency_count());
1810
EXPECT_EQ(bar_file_, foo_file_->dependency(0));
1812
const FileDescriptor* baz_file = foo_file_->dependency(1);
1813
EXPECT_EQ("baz.proto", baz_file->name());
1814
EXPECT_EQ(0, baz_file->message_type_count());
1816
// Placeholder files should not be findable.
1817
EXPECT_EQ(bar_file_, pool_.FindFileByName(bar_file_->name()));
1818
EXPECT_TRUE(pool_.FindFileByName(baz_file->name()) == NULL);
1821
TEST_F(AllowUnknownDependenciesTest, PlaceholderTypes) {
1822
ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_field_->type());
1823
EXPECT_EQ(bar_type_, bar_field_->message_type());
1825
ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_field_->type());
1826
const Descriptor* baz_type = baz_field_->message_type();
1827
EXPECT_EQ("Baz", baz_type->name());
1828
EXPECT_EQ("Baz", baz_type->full_name());
1829
EXPECT_EQ("Baz.placeholder.proto", baz_type->file()->name());
1830
EXPECT_EQ(0, baz_type->extension_range_count());
1832
ASSERT_EQ(FieldDescriptor::TYPE_ENUM, qux_field_->type());
1833
const EnumDescriptor* qux_type = qux_field_->enum_type();
1834
EXPECT_EQ("Qux", qux_type->name());
1835
EXPECT_EQ("corge.Qux", qux_type->full_name());
1836
EXPECT_EQ("corge.Qux.placeholder.proto", qux_type->file()->name());
1838
// Placeholder types should not be findable.
1839
EXPECT_EQ(bar_type_, pool_.FindMessageTypeByName(bar_type_->full_name()));
1840
EXPECT_TRUE(pool_.FindMessageTypeByName(baz_type->full_name()) == NULL);
1841
EXPECT_TRUE(pool_.FindEnumTypeByName(qux_type->full_name()) == NULL);
1844
TEST_F(AllowUnknownDependenciesTest, CopyTo) {
1845
// FieldDescriptor::CopyTo() should write non-fully-qualified type names
1846
// for placeholder types which were not originally fully-qualified.
1847
FieldDescriptorProto proto;
1849
// Bar is not a placeholder, so it is fully-qualified.
1850
bar_field_->CopyTo(&proto);
1851
EXPECT_EQ(".Bar", proto.type_name());
1852
EXPECT_EQ(FieldDescriptorProto::TYPE_MESSAGE, proto.type());
1854
// Baz is an unqualified placeholder.
1856
baz_field_->CopyTo(&proto);
1857
EXPECT_EQ("Baz", proto.type_name());
1858
EXPECT_FALSE(proto.has_type());
1860
// Qux is a fully-qualified placeholder.
1862
qux_field_->CopyTo(&proto);
1863
EXPECT_EQ(".corge.Qux", proto.type_name());
1864
EXPECT_EQ(FieldDescriptorProto::TYPE_ENUM, proto.type());
1867
TEST_F(AllowUnknownDependenciesTest, CustomOptions) {
1868
// Qux should still have the uninterpreted option attached.
1869
ASSERT_EQ(1, qux_field_->options().uninterpreted_option_size());
1870
const UninterpretedOption& option =
1871
qux_field_->options().uninterpreted_option(0);
1872
ASSERT_EQ(1, option.name_size());
1873
EXPECT_EQ("grault", option.name(0).name_part());
1876
TEST_F(AllowUnknownDependenciesTest, UnknownExtendee) {
1877
// Test that we can extend an unknown type. This is slightly tricky because
1878
// it means that the placeholder type must have an extension range.
1880
FileDescriptorProto extension_proto;
1882
ASSERT_TRUE(TextFormat::ParseFromString(
1883
"name: 'extension.proto'"
1884
"extension { extendee: 'UnknownType' name:'some_extension' number:123"
1885
" label:LABEL_OPTIONAL type:TYPE_INT32 }",
1887
const FileDescriptor* file = pool_.BuildFile(extension_proto);
1889
ASSERT_TRUE(file != NULL);
1891
ASSERT_EQ(1, file->extension_count());
1892
const Descriptor* extendee = file->extension(0)->containing_type();
1893
EXPECT_EQ("UnknownType", extendee->name());
1894
ASSERT_EQ(1, extendee->extension_range_count());
1895
EXPECT_EQ(1, extendee->extension_range(0)->start);
1896
EXPECT_EQ(FieldDescriptor::kMaxNumber + 1, extendee->extension_range(0)->end);
1899
TEST_F(AllowUnknownDependenciesTest, CustomOption) {
1900
// Test that we can use a custom option without having parsed
1901
// descriptor.proto.
1903
FileDescriptorProto option_proto;
1905
ASSERT_TRUE(TextFormat::ParseFromString(
1906
"name: \"unknown_custom_options.proto\" "
1907
"dependency: \"google/protobuf/descriptor.proto\" "
1909
" extendee: \"google.protobuf.FileOptions\" "
1910
" name: \"some_option\" "
1912
" label: LABEL_OPTIONAL "
1913
" type: TYPE_INT32 "
1916
" uninterpreted_option { "
1918
" name_part: \"some_option\" "
1919
" is_extension: true "
1921
" positive_int_value: 1234 "
1923
" uninterpreted_option { "
1925
" name_part: \"unknown_option\" "
1926
" is_extension: true "
1928
" positive_int_value: 1234 "
1930
" uninterpreted_option { "
1932
" name_part: \"optimize_for\" "
1933
" is_extension: false "
1935
" identifier_value: \"SPEED\" "
1940
const FileDescriptor* file = pool_.BuildFile(option_proto);
1941
ASSERT_TRUE(file != NULL);
1943
// Verify that no extension options were set, but they were left as
1944
// uninterpreted_options.
1945
vector<const FieldDescriptor*> fields;
1946
file->options().GetReflection()->ListFields(file->options(), &fields);
1947
ASSERT_EQ(2, fields.size());
1948
EXPECT_TRUE(file->options().has_optimize_for());
1949
EXPECT_EQ(2, file->options().uninterpreted_option_size());
1952
// ===================================================================
1536
1954
TEST(CustomOptions, OptionLocations) {
1537
1955
const Descriptor* message =
1538
1956
protobuf_unittest::TestMessageWithCustomOptions::descriptor();