Two tests for Ruby code generator:

- A golden-file test that ensures protoc produces known-valid output.
- A Ruby test that loads that golden file and ensures it actually works
  with the extension.

This split strategy allows us to test end-to-end without needing to
integrate the Ruby gem build system and the protoc build system. This is
desirable because we do not want a gem build/install to depend on
building protoc, and we do not want building protoc to depend on
building and testing the gem.
diff --git a/ruby/tests/generated_code.rb b/ruby/tests/generated_code.rb
new file mode 100644
index 0000000..db762ad
--- /dev/null
+++ b/ruby/tests/generated_code.rb
@@ -0,0 +1,124 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: generated_code.proto
+
+require 'google/protobuf'
+
+Google::Protobuf::DescriptorPool.generated_pool.build do
+  add_message "A.B.C.TestMessage" do
+    optional :optional_int32, :int32, 1
+    optional :optional_int64, :int64, 2
+    optional :optional_uint32, :uint32, 3
+    optional :optional_uint64, :uint64, 4
+    optional :optional_bool, :bool, 5
+    optional :optional_double, :double, 6
+    optional :optional_float, :float, 7
+    optional :optional_string, :string, 8
+    optional :optional_bytes, :string, 9
+    optional :optional_enum, :enum, 10, "A.B.C.TestEnum"
+    optional :optional_msg, :message, 11, "A.B.C.TestMessage"
+    repeated :repeated_int32, :int32, 21
+    repeated :repeated_int64, :int64, 22
+    repeated :repeated_uint32, :uint32, 23
+    repeated :repeated_uint64, :uint64, 24
+    repeated :repeated_bool, :bool, 25
+    repeated :repeated_double, :double, 26
+    repeated :repeated_float, :float, 27
+    repeated :repeated_string, :string, 28
+    repeated :repeated_bytes, :string, 29
+    repeated :repeated_enum, :enum, 30, "A.B.C.TestEnum"
+    repeated :repeated_msg, :message, 31, "A.B.C.TestMessage"
+    repeated :map_int32_string, :message, 61, "A.B.C.TestMessage.MapInt32StringEntry"
+    repeated :map_int64_string, :message, 62, "A.B.C.TestMessage.MapInt64StringEntry"
+    repeated :map_uint32_string, :message, 63, "A.B.C.TestMessage.MapUint32StringEntry"
+    repeated :map_uint64_string, :message, 64, "A.B.C.TestMessage.MapUint64StringEntry"
+    repeated :map_bool_string, :message, 65, "A.B.C.TestMessage.MapBoolStringEntry"
+    repeated :map_string_string, :message, 66, "A.B.C.TestMessage.MapStringStringEntry"
+    repeated :map_string_msg, :message, 67, "A.B.C.TestMessage.MapStringMsgEntry"
+    repeated :map_string_enum, :message, 68, "A.B.C.TestMessage.MapStringEnumEntry"
+    repeated :map_string_int32, :message, 69, "A.B.C.TestMessage.MapStringInt32Entry"
+    repeated :map_string_bool, :message, 70, "A.B.C.TestMessage.MapStringBoolEntry"
+    optional :nested_message, :message, 80, "A.B.C.TestMessage.NestedMessage"
+    oneof :my_oneof do
+      optional :oneof_int32, :int32, 41
+      optional :oneof_int64, :int64, 42
+      optional :oneof_uint32, :uint32, 43
+      optional :oneof_uint64, :uint64, 44
+      optional :oneof_bool, :bool, 45
+      optional :oneof_double, :double, 46
+      optional :oneof_float, :float, 47
+      optional :oneof_string, :string, 48
+      optional :oneof_bytes, :string, 49
+      optional :oneof_enum, :enum, 50, "A.B.C.TestEnum"
+      optional :oneof_msg, :message, 51, "A.B.C.TestMessage"
+    end
+  end
+  add_message "A.B.C.TestMessage.MapInt32StringEntry" do
+    optional :key, :int32, 1
+    optional :value, :string, 2
+  end
+  add_message "A.B.C.TestMessage.MapInt64StringEntry" do
+    optional :key, :int64, 1
+    optional :value, :string, 2
+  end
+  add_message "A.B.C.TestMessage.MapUint32StringEntry" do
+    optional :key, :uint32, 1
+    optional :value, :string, 2
+  end
+  add_message "A.B.C.TestMessage.MapUint64StringEntry" do
+    optional :key, :uint64, 1
+    optional :value, :string, 2
+  end
+  add_message "A.B.C.TestMessage.MapBoolStringEntry" do
+    optional :key, :bool, 1
+    optional :value, :string, 2
+  end
+  add_message "A.B.C.TestMessage.MapStringStringEntry" do
+    optional :key, :string, 1
+    optional :value, :string, 2
+  end
+  add_message "A.B.C.TestMessage.MapStringMsgEntry" do
+    optional :key, :string, 1
+    optional :value, :message, 2, "A.B.C.TestMessage"
+  end
+  add_message "A.B.C.TestMessage.MapStringEnumEntry" do
+    optional :key, :string, 1
+    optional :value, :enum, 2, "A.B.C.TestEnum"
+  end
+  add_message "A.B.C.TestMessage.MapStringInt32Entry" do
+    optional :key, :string, 1
+    optional :value, :int32, 2
+  end
+  add_message "A.B.C.TestMessage.MapStringBoolEntry" do
+    optional :key, :string, 1
+    optional :value, :bool, 2
+  end
+  add_message "A.B.C.TestMessage.NestedMessage" do
+    optional :foo, :int32, 1
+  end
+  add_enum "A.B.C.TestEnum" do
+    value :Default, 0
+    value :A, 1
+    value :B, 2
+    value :C, 3
+  end
+end
+
+module A
+  module B
+    module C
+      TestMessage = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage").msgclass
+      TestMessage::MapInt32StringEntry = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.MapInt32StringEntry").msgclass
+      TestMessage::MapInt64StringEntry = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.MapInt64StringEntry").msgclass
+      TestMessage::MapUint32StringEntry = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.MapUint32StringEntry").msgclass
+      TestMessage::MapUint64StringEntry = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.MapUint64StringEntry").msgclass
+      TestMessage::MapBoolStringEntry = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.MapBoolStringEntry").msgclass
+      TestMessage::MapStringStringEntry = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.MapStringStringEntry").msgclass
+      TestMessage::MapStringMsgEntry = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.MapStringMsgEntry").msgclass
+      TestMessage::MapStringEnumEntry = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.MapStringEnumEntry").msgclass
+      TestMessage::MapStringInt32Entry = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.MapStringInt32Entry").msgclass
+      TestMessage::MapStringBoolEntry = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.MapStringBoolEntry").msgclass
+      TestMessage::NestedMessage = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.NestedMessage").msgclass
+      TestEnum = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestEnum").enummodule
+    end
+  end
+end