// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

module v23proxy.tests.transcoder_testcases;

import "mojo/public/interfaces/bindings/tests/test_unions.mojom";

struct UnnamedPrimitiveTestStruct {
    uint32 A;
    string B;
    bool C;
    float D;
};

struct VarietyOfBitSizesStruct {
 bool A;
 uint8 B;
 uint16 C;
 uint32 D;
 uint64 E;
 string F;
 array<int8> H;
 map<string, bool> I;
 int32 J;
 int16 K;
 int8 L;
 bool M;
 bool N;
 uint32 O;
};

struct PodUnionWrapper {
  mojo.test.PodUnion pod_union;
};


struct ObjectUnionWrapper {
  mojo.test.ObjectUnion object_union;
};

enum TestEnum {
    A, B, C
};

struct TestBasicStruct {
  TestEnum TestEnum;
  int32 a;
};

struct TestCyclicStruct {
    TestEnum TestEnum;
    TestCyclicStruct? TestCyclicStruct;
    int32 a;
};


// Mirrors the Customer benchmark type from the VOM benchmarks (see v.io/v23/vom/internal/perf_test.go).
struct Customer {
	string Name;
	int64 Id;
	bool Active;
	AddressInfo Address;
	CreditReport Credit;
};

struct AddressInfo {
	string Street;
	string City;
	string State;
	string Zip;
};

enum CreditAgency {
	Equifax,
	Experian,
	TransUnion,
};

enum ExperianRating {
	Good,
	Bad,
};

struct EquifaxCreditReport {
	uint8 Rating;
};

struct ExperianCreditReport {
	ExperianRating Rating;
};

struct TransUnionCreditReport {
	int16 Rating;
};

union AgencyReport {
	EquifaxCreditReport EquifaxReport;
	ExperianCreditReport ExperianReport;
	TransUnionCreditReport TransUnionReport;
};

struct CreditReport {
	CreditAgency Agency;
	AgencyReport Report;
};