cd root
cue import proto -I ../include ./...
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.com/api"

-- root/cue.mod/module.cue --
module: "acme.com/api"

-- 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.com/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.com/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 |
		#TYPE_B

	#TYPE_A: 1
	#TYPE_B: 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.com/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)
}
