cd root
exec cue import proto -I ../include ./... --proto_enum=json
cd ..

cmp stderr expect-stderr
cmp stdout expect-stdout
cmp root/mixer/v1/attributes_proto_gen.cue expect-attributes_proto_gen.cue
cmp root/mixer/v1/config/client/client_config_proto_gen.cue expect-client_config_proto_gen.cue
cmp root/cue.mod/gen/googleapis.com/acme/test/test_proto_gen.cue expect-test_proto_gen.cue

-- expect-stdout --
-- expect-stderr --
Skipping file "cue.mod/gen/googleapis.com/acme/test/test/test_proto_gen.cue": already exists.
Use -Rf to override.
-- root/cue.mod/module.cue --
module: "acme.test/api"
language: version: "v0.9.0"
-- root/cue.mod/gen/googleapis.com/acme/test/test/test_proto_gen.cue --
package test_test

#AnotherTest: {
	test?: int32 @protobuf(1)
}
-- root/mixer/v1/attributes.proto --
syntax = "proto3";

import "google/protobuf/timestamp.proto";
import "acme/test.proto";
import "acme/test/test.proto";

package acme.mixer.v1;

option go_package = "acme.test/api/mixer/v1";

// Attributes defines attributes.
message Attributes {
  enum Type {
    TYPE_A = 1;
    TYPE_B = 2;
  }

  // A map of attribute name to its value.
  map<string, AttributeValue> attributes = 1;

  // Specifies one attribute value with different type.
  message AttributeValue {
    // The attribute value.
    oneof value {
      string string_value = 2;
      int64 int64_value = 3;
      double double_value = 4;
      bool bool_value = 5;
      bytes bytes_value = 6;
      google.protobuf.Timestamp timestamp_value = 7;

      // Used for values of type STRING_MAP
      StringMap string_map_value = 9;

      acme.test.Test test_value = 10;
      acme.test.test.AnotherTest test_value = 11;
    }
  }

  // Defines a string map.
  message StringMap {
    // Holds a set of name/value pairs.
    map<string, string> entries = 1;
  }
}

-- root/mixer/v1/config/client/client_config.proto --
syntax = "proto3";

import "mixer/v1/attributes.proto";

// Describes the configuration state for the Mixer client library that's built into Envoy.
package acme.mixer.v1.config.client;

option go_package = "acme.test/api/mixer/v1/config/client";

// Defines the per-service client configuration.
message ServiceConfig {
  bool disable_check_calls = 1;
  bool disable_report_calls = 2;
  Attributes mixer_attributes = 3;
}
-- include/acme/test.proto --
syntax = "proto3";

package acme.test;

message Test {
  int32 test = 1;
}

-- include/acme/test/test.proto --
syntax = "proto3";

package acme.test.test;

// Override the short name only of this package. This notation is seen in some
// gogoproto files.
option go_package = "test_test"

message AnotherTest {
  int32 test = 1;
}

-- include/google/protobuf/timestamp.proto --
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

syntax = "proto3";

package google.protobuf;

option csharp_namespace = "Google.Protobuf.WellKnownTypes";
option cc_enable_arenas = true;
option go_package = "github.com/golang/protobuf/ptypes/timestamp";
option java_package = "com.google.protobuf";
option java_outer_classname = "TimestampProto";
option java_multiple_files = true;
option objc_class_prefix = "GPB";

message Timestamp {
  // Represents seconds of UTC time since Unix epoch
  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
  // 9999-12-31T23:59:59Z inclusive.
  int64 seconds = 1;

  // Non-negative fractions of a second at nanosecond resolution. Negative
  // second values with fractions must still have non-negative nanos values
  // that count forward in time. Must be from 0 to 999,999,999
  // inclusive.
  int32 nanos = 2;
}

-- expect-attributes_proto_gen.cue --
package v1

import (
	"time"
	"googleapis.com/acme/test"
	"googleapis.com/acme/test/test:test_test"
)

// Attributes defines attributes.
#Attributes: {
	#Type: {"TYPE_A", #enumValue: 1} |
		{"TYPE_B", #enumValue: 2}

	#Type_value: {
		TYPE_A: 1
		TYPE_B: 2
	}

	// A map of attribute name to its value.
	attributes?: {
		[string]: #AttributeValue
	} @protobuf(1,map[string]AttributeValue)

	// Specifies one attribute value with different type.
	#AttributeValue: {
		// The attribute value.
		{} | {
			stringValue: string @protobuf(2,string,name=string_value)
		} | {
			int64Value: int64 @protobuf(3,int64,name=int64_value)
		} | {
			doubleValue: float64 @protobuf(4,double,name=double_value)
		} | {
			boolValue: bool @protobuf(5,bool,name=bool_value)
		} | {
			bytesValue: bytes @protobuf(6,bytes,name=bytes_value)
		} | {
			timestampValue: time.Time @protobuf(7,google.protobuf.Timestamp,name=timestamp_value)
		} | {
			// Used for values of type STRING_MAP
			stringMapValue: #StringMap @protobuf(9,StringMap,name=string_map_value)
		} | {
			testValue: test.#Test @protobuf(10,acme.test.Test,name=test_value)
		} | {
			testValue: test_test.#AnotherTest @protobuf(11,acme.test.test.AnotherTest,name=test_value)
		}
	}

	// Defines a string map.
	#StringMap: {
		// Holds a set of name/value pairs.
		entries?: {
			[string]: string
		} @protobuf(1,map[string]string)
	}
}
-- expect-client_config_proto_gen.cue --
// Describes the configuration state for the Mixer client library that's built into Envoy.
package client

import "acme.test/api/mixer/v1"

// Defines the per-service client configuration.
#ServiceConfig: {
	disableCheckCalls?:  bool           @protobuf(1,bool,name=disable_check_calls)
	disableReportCalls?: bool           @protobuf(2,bool,name=disable_report_calls)
	mixerAttributes?:    v1.#Attributes @protobuf(3,Attributes,name=mixer_attributes)
}
-- expect-test_proto_gen.cue --
package test

#Test: {
	test?: int32 @protobuf(1,int32)
}
