// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/test_condition.proto

package test_condition

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type TestCase_Framework int32

const (
	TestCase_FRAMEWORK_UNSPECIFIED TestCase_Framework = 0
	TestCase_FRAMEWORK_TAST        TestCase_Framework = 1
)

var TestCase_Framework_name = map[int32]string{
	0: "FRAMEWORK_UNSPECIFIED",
	1: "FRAMEWORK_TAST",
}

var TestCase_Framework_value = map[string]int32{
	"FRAMEWORK_UNSPECIFIED": 0,
	"FRAMEWORK_TAST":        1,
}

func (x TestCase_Framework) String() string {
	return proto.EnumName(TestCase_Framework_name, int32(x))
}

func (TestCase_Framework) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3e29bce781f19cf1, []int{1, 0}
}

// TestCaseSet contains all information about the target test.
type TestCaseSet struct {
	TestCases            []*TestCase `protobuf:"bytes,1,rep,name=test_cases,json=testCases,proto3" json:"test_cases,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *TestCaseSet) Reset()         { *m = TestCaseSet{} }
func (m *TestCaseSet) String() string { return proto.CompactTextString(m) }
func (*TestCaseSet) ProtoMessage()    {}
func (*TestCaseSet) Descriptor() ([]byte, []int) {
	return fileDescriptor_3e29bce781f19cf1, []int{0}
}

func (m *TestCaseSet) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TestCaseSet.Unmarshal(m, b)
}
func (m *TestCaseSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TestCaseSet.Marshal(b, m, deterministic)
}
func (m *TestCaseSet) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TestCaseSet.Merge(m, src)
}
func (m *TestCaseSet) XXX_Size() int {
	return xxx_messageInfo_TestCaseSet.Size(m)
}
func (m *TestCaseSet) XXX_DiscardUnknown() {
	xxx_messageInfo_TestCaseSet.DiscardUnknown(m)
}

var xxx_messageInfo_TestCaseSet proto.InternalMessageInfo

func (m *TestCaseSet) GetTestCases() []*TestCase {
	if m != nil {
		return m.TestCases
	}
	return nil
}

// TestCase contains information about a test case.
type TestCase struct {
	// Test framework where this test case comes from.
	Framework TestCase_Framework `protobuf:"varint,1,opt,name=framework,proto3,enum=test_condition.TestCase_Framework" json:"framework,omitempty"`
	// Required. The name of this test case. E.g. "ui.ChromeLogin".
	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	// Describes the dependencies which needs to be satisfied to run this test.
	Condition            *TestCondition `protobuf:"bytes,3,opt,name=condition,proto3" json:"condition,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *TestCase) Reset()         { *m = TestCase{} }
func (m *TestCase) String() string { return proto.CompactTextString(m) }
func (*TestCase) ProtoMessage()    {}
func (*TestCase) Descriptor() ([]byte, []int) {
	return fileDescriptor_3e29bce781f19cf1, []int{1}
}

func (m *TestCase) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TestCase.Unmarshal(m, b)
}
func (m *TestCase) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TestCase.Marshal(b, m, deterministic)
}
func (m *TestCase) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TestCase.Merge(m, src)
}
func (m *TestCase) XXX_Size() int {
	return xxx_messageInfo_TestCase.Size(m)
}
func (m *TestCase) XXX_DiscardUnknown() {
	xxx_messageInfo_TestCase.DiscardUnknown(m)
}

var xxx_messageInfo_TestCase proto.InternalMessageInfo

func (m *TestCase) GetFramework() TestCase_Framework {
	if m != nil {
		return m.Framework
	}
	return TestCase_FRAMEWORK_UNSPECIFIED
}

func (m *TestCase) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *TestCase) GetCondition() *TestCondition {
	if m != nil {
		return m.Condition
	}
	return nil
}

// Describes the condition which needs to be satisfied to run a test case.
// The condition is formed in a "Disjunctive normal form".
type TestCondition struct {
	// If an entry in the disjunct_components is satisfied, this condition is
	// considered as satisfied. In other words, TestCondition is the "OR" of all
	// disjunct_components.
	// If there is no entry in disjunct_components, this TestCondition is always
	// considered as satisfied.
	DisjuctComponents    []*TestConditionComponent `protobuf:"bytes,1,rep,name=disjuct_components,json=disjuctComponents,proto3" json:"disjuct_components,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *TestCondition) Reset()         { *m = TestCondition{} }
func (m *TestCondition) String() string { return proto.CompactTextString(m) }
func (*TestCondition) ProtoMessage()    {}
func (*TestCondition) Descriptor() ([]byte, []int) {
	return fileDescriptor_3e29bce781f19cf1, []int{2}
}

func (m *TestCondition) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TestCondition.Unmarshal(m, b)
}
func (m *TestCondition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TestCondition.Marshal(b, m, deterministic)
}
func (m *TestCondition) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TestCondition.Merge(m, src)
}
func (m *TestCondition) XXX_Size() int {
	return xxx_messageInfo_TestCondition.Size(m)
}
func (m *TestCondition) XXX_DiscardUnknown() {
	xxx_messageInfo_TestCondition.DiscardUnknown(m)
}

var xxx_messageInfo_TestCondition proto.InternalMessageInfo

func (m *TestCondition) GetDisjuctComponents() []*TestConditionComponent {
	if m != nil {
		return m.DisjuctComponents
	}
	return nil
}

// Describes one "disjunct component" of the TestCondition, which is the "AND"
// of all its fields.
type TestConditionComponent struct {
	// Represents the condition about device/config.proto.
	DeviceConfig *DeviceConfigCondition `protobuf:"bytes,1,opt,name=device_config,json=deviceConfig,proto3" json:"device_config,omitempty"`
	// Represents the condition about lab/peripherals.proto.
	LabPeripherals       *LabPeripheralsCondition `protobuf:"bytes,2,opt,name=lab_peripherals,json=labPeripherals,proto3" json:"lab_peripherals,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *TestConditionComponent) Reset()         { *m = TestConditionComponent{} }
func (m *TestConditionComponent) String() string { return proto.CompactTextString(m) }
func (*TestConditionComponent) ProtoMessage()    {}
func (*TestConditionComponent) Descriptor() ([]byte, []int) {
	return fileDescriptor_3e29bce781f19cf1, []int{3}
}

func (m *TestConditionComponent) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TestConditionComponent.Unmarshal(m, b)
}
func (m *TestConditionComponent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TestConditionComponent.Marshal(b, m, deterministic)
}
func (m *TestConditionComponent) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TestConditionComponent.Merge(m, src)
}
func (m *TestConditionComponent) XXX_Size() int {
	return xxx_messageInfo_TestConditionComponent.Size(m)
}
func (m *TestConditionComponent) XXX_DiscardUnknown() {
	xxx_messageInfo_TestConditionComponent.DiscardUnknown(m)
}

var xxx_messageInfo_TestConditionComponent proto.InternalMessageInfo

func (m *TestConditionComponent) GetDeviceConfig() *DeviceConfigCondition {
	if m != nil {
		return m.DeviceConfig
	}
	return nil
}

func (m *TestConditionComponent) GetLabPeripherals() *LabPeripheralsCondition {
	if m != nil {
		return m.LabPeripherals
	}
	return nil
}

func init() {
	proto.RegisterEnum("test_condition.TestCase_Framework", TestCase_Framework_name, TestCase_Framework_value)
	proto.RegisterType((*TestCaseSet)(nil), "test_condition.TestCaseSet")
	proto.RegisterType((*TestCase)(nil), "test_condition.TestCase")
	proto.RegisterType((*TestCondition)(nil), "test_condition.TestCondition")
	proto.RegisterType((*TestConditionComponent)(nil), "test_condition.TestConditionComponent")
}

func init() { proto.RegisterFile("test/test_condition.proto", fileDescriptor_3e29bce781f19cf1) }

var fileDescriptor_3e29bce781f19cf1 = []byte{
	// 383 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xdf, 0x0a, 0xd3, 0x30,
	0x14, 0xc6, 0x8d, 0x13, 0xb1, 0xa7, 0xae, 0xce, 0x80, 0xd2, 0x4d, 0x84, 0x52, 0x50, 0x7b, 0xd5,
	0x42, 0xbd, 0x50, 0xe6, 0x8d, 0xb3, 0x5b, 0x61, 0xfe, 0x1d, 0xdd, 0x86, 0xe0, 0xcd, 0xc8, 0xda,
	0xb4, 0x8b, 0xae, 0x4d, 0x49, 0x32, 0x7d, 0x33, 0xdf, 0xc5, 0xb7, 0x91, 0xc5, 0x75, 0x75, 0x65,
	0x7a, 0x53, 0x92, 0xf3, 0xfd, 0xce, 0x77, 0xc2, 0xd7, 0x03, 0x43, 0x45, 0xa5, 0x0a, 0x8e, 0x9f,
	0x4d, 0xca, 0xab, 0x8c, 0x29, 0xc6, 0x2b, 0xbf, 0x16, 0x5c, 0x71, 0x6c, 0x5d, 0x56, 0x47, 0x8f,
	0x34, 0x9a, 0xd1, 0xef, 0x2c, 0xa5, 0x5d, 0x78, 0x64, 0x6b, 0x71, 0x4f, 0xb6, 0x5d, 0xc5, 0x8d,
	0xc1, 0x5c, 0x51, 0xa9, 0x22, 0x22, 0xe9, 0x92, 0x2a, 0xfc, 0x02, 0xe0, 0x8f, 0x2f, 0x91, 0x54,
	0xda, 0xc8, 0xe9, 0x79, 0x66, 0x68, 0xfb, 0x9d, 0x07, 0x34, 0x0d, 0x89, 0xa1, 0x4e, 0x27, 0xe9,
	0xfe, 0x42, 0x70, 0xa7, 0xa9, 0xe3, 0xd7, 0x60, 0xe4, 0x82, 0x94, 0xf4, 0x07, 0x17, 0xdf, 0x6c,
	0xe4, 0x20, 0xcf, 0x0a, 0xdd, 0x7f, 0x99, 0xf8, 0x71, 0x43, 0x26, 0x6d, 0x13, 0xc6, 0x70, 0xab,
	0x22, 0x25, 0xb5, 0x6f, 0x3a, 0xc8, 0x33, 0x12, 0x7d, 0xc6, 0xaf, 0xc0, 0x38, 0xb7, 0xdb, 0x3d,
	0x07, 0x79, 0x66, 0xf8, 0xf8, 0xaa, 0x6b, 0x73, 0x4b, 0x5a, 0xde, 0x1d, 0x83, 0x71, 0x1e, 0x84,
	0x87, 0xf0, 0x20, 0x4e, 0x26, 0x1f, 0x66, 0x9f, 0x3f, 0x25, 0xef, 0x36, 0xeb, 0x8f, 0xcb, 0xc5,
	0x2c, 0x9a, 0xc7, 0xf3, 0xd9, 0x74, 0x70, 0x03, 0x63, 0xb0, 0x5a, 0x69, 0x35, 0x59, 0xae, 0x06,
	0xc8, 0xcd, 0xa1, 0x7f, 0xe1, 0x8b, 0xd7, 0x80, 0x33, 0x26, 0xbf, 0x1e, 0xd2, 0xe3, 0xe8, 0xb2,
	0xe6, 0x15, 0xad, 0x54, 0x93, 0xd6, 0xd3, 0xff, 0x3e, 0x29, 0x6a, 0xf0, 0xe4, 0xfe, 0xc9, 0xe1,
	0x5c, 0x91, 0xee, 0x4f, 0x04, 0x0f, 0xaf, 0xd3, 0xf8, 0x2d, 0xf4, 0xdb, 0x5f, 0x9b, 0xb3, 0x42,
	0xa7, 0x6a, 0x86, 0x4f, 0xba, 0xc3, 0xa6, 0x1a, 0x8a, 0x34, 0xd3, 0xe6, 0x70, 0x37, 0xfb, 0xab,
	0x8c, 0x17, 0x70, 0xef, 0xb8, 0x09, 0x35, 0x15, 0xac, 0xde, 0x51, 0x41, 0xf6, 0x52, 0xc7, 0x6c,
	0x86, 0xcf, 0xba, 0x6e, 0xef, 0xc9, 0x76, 0xd1, 0x52, 0xad, 0x9f, 0xb5, 0xbf, 0x10, 0xde, 0x8c,
	0xbf, 0xbc, 0x2c, 0xb8, 0x9f, 0xee, 0x04, 0x2f, 0xd9, 0xa1, 0xf4, 0xb9, 0x28, 0x82, 0xe6, 0xc2,
	0x65, 0xc0, 0xaa, 0x5c, 0x90, 0x40, 0xaf, 0x5b, 0x50, 0xf0, 0xce, 0x36, 0x6f, 0x6f, 0x6b, 0xe1,
	0xf9, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x75, 0x94, 0xed, 0xe7, 0xeb, 0x02, 0x00, 0x00,
}
