syntax = "proto2";

package testprotos;

option go_package = "github.com/jhump/protoreflect/internal/testprotos";

// Comment for AnotherTestMessage
message AnotherTestMessage {
   // Comment for dne
   optional TestMessage.NestedMessage.AnotherNestedMessage.YetAnotherNestedMessage.DeeplyNestedEnum dne = 1;

   // Comment for map_field1
   map<int32, string> map_field1 = 2;

   // Comment for map_field2
   map<int64, float> map_field2 = 3;

   // Comment for map_field3
   map<uint32, bool> map_field3 = 4;

   // Comment for map_field4
   map<string, AnotherTestMessage> map_field4 = 5;

   // Comment for RockNRoll
   optional group RockNRoll = 6 {
      // Comment for beatles
      optional string beatles = 1;

      // Comment for stones
      optional string stones = 2;

      // Comment for doors
      optional string doors = 3;
   }

   // Comment for atmoo
   oneof atmoo {
      // Comment for str
      string str = 7;

      // Comment for int
      int64 int = 8;
   }

   // Comment for WithOptions
   optional group WithOptions = 9 [deprecated = true] {
   }

   extensions 100 to 200;
}

// Comment for TestMessage
message TestMessage {
   // Comment for nm
   optional NestedMessage nm = 1;

   // Comment for anm
   optional NestedMessage.AnotherNestedMessage anm = 2;

   // Comment for yanm
   optional NestedMessage.AnotherNestedMessage.YetAnotherNestedMessage yanm = 3;

   // Comment for ne
   repeated NestedEnum ne = 4;

   // Comment for NestedMessage
   message NestedMessage {
      // Comment for anm
      optional AnotherNestedMessage anm = 1;

      // Comment for yanm
      optional AnotherNestedMessage.YetAnotherNestedMessage yanm = 2;

      // Comment for AnotherNestedMessage
      message AnotherNestedMessage {
         // Comment for yanm
         repeated YetAnotherNestedMessage yanm = 1;

         // Comment for YetAnotherNestedMessage
         message YetAnotherNestedMessage {
            // Comment for foo
            optional string foo = 1;

            // Comment for bar
            optional int32 bar = 2;

            // Comment for baz
            optional bytes baz = 3;

            // Comment for dne
            optional DeeplyNestedEnum dne = 4;

            // Comment for anm
            optional AnotherNestedMessage anm = 5;

            // Comment for nm
            optional NestedMessage nm = 6;

            // Comment for tm
            optional TestMessage tm = 7;

            // Comment for DeeplyNestedEnum
            enum DeeplyNestedEnum {
               // Comment for VALUE1
               VALUE1 = 1;

               // Comment for VALUE2
               VALUE2 = 2;
            }
         }

         // Comment for AnotherTestMessage extensions (1)
         extend AnotherTestMessage {
            // Comment for flags
            repeated bool flags = 200 [packed = true];
         }
      }
   }

   // Comment for NestedEnum
   enum NestedEnum {
      // Comment for VALUE1
      VALUE1 = 1;

      // Comment for VALUE2
      VALUE2 = 2;
   }
}

// Comment for AnotherTestMessage extensions (2)
extend AnotherTestMessage {
   // Comment for xtm
   optional TestMessage xtm = 100;

   // Comment for xs
   optional string xs = 101;
}

// Comment for AnotherTestMessage extensions (3)
extend AnotherTestMessage {
   // Comment for xi
   optional int32 xi = 102;

   // Comment for xui
   optional uint64 xui = 103;
}
