# DO NOT EDIT; generated by go run testdata/gen.go
#
#name: builtins
#evalPartial
-- in.cue --
import (
  "list"
  "strings"
)

a1: {
	a: and([b, c])
	b: =~"oo"
	c: =~"fo"
}
a2: a1 & {a: "foo"}
a3: a1 & {a: "bar"}

o1: {
	a: or([b, c])
	b: string
	c: "bar"
}
o2: o1 & {a: "foo"}
o3: o1 & {a: "foo", b: "baz"}

// Issue #585
stringListErrors: {
    a: {
        x: [string, ...string]
        result: strings.Join(x, " ")
    }

    b: {
        x: [int, ...string]
        result: strings.Join(x, " ")
    }

    c: {
        x: []
        result: strings.Join(x, int)
    }
}

decimalListErrors: {
    a: {
        x: [string]
        result: list.Avg(x)
    }

    b: {
        x: [int, ...string]
        result: list.Avg(x)
    }
}

-- out/def --
a1: {
	a: =~"oo" & =~"fo"
	b: =~"oo"
	c: =~"fo"
}
a2: a1 & {
	a: "foo"
}
a3: a1 & {
	a: "bar"
}
o1: {
	a: string
	b: string
	c: "bar"
}
o2: o1 & {
	a: "foo"
}
o3: o1 & {
	a: "foo"
	b: "baz"
}
-- out/legacy-debug --
<0>{a1: <1>{a: (=~"oo" & =~"fo"), b: =~"oo", c: =~"fo"}, a2: <2>{a: "foo", b: =~"oo", c: =~"fo"}, a3: <3>{a: _|_((=~"oo" & "bar"):invalid value "bar" (does not match =~"oo")), b: =~"oo", c: =~"fo"}, o1: <4>{a: string, b: string, c: "bar"}, o2: <5>{a: "foo", b: string, c: "bar"}, o3: <6>{a: _|_(("baz" & "foo"):empty disjunction: conflicting values "baz" and "foo";("bar" & "foo"):empty disjunction: conflicting values "bar" and "foo"), b: "baz", c: "bar"}}
-- out/eval --
Errors:
o3.a: 2 errors in empty disjunction:
o3.a: conflicting values "bar" and "foo":
    ./in.cue:15:12
    ./in.cue:17:5
    ./in.cue:20:5
    ./in.cue:20:14
o3.a: conflicting values "baz" and "foo":
    ./in.cue:15:9
    ./in.cue:20:5
    ./in.cue:20:14
    ./in.cue:20:24
a3.a: invalid value "bar" (out of bound =~"oo"):
    ./in.cue:8:5
a3.a: invalid value "bar" (out of bound =~"fo"):
    ./in.cue:9:5
stringListErrors.b.result: invalid type element 0 (int) of string list argument 0:
    ./in.cue:31:17
stringListErrors.c.result: cannot use int (type int) as string in argument 2 to strings.Join:
    ./in.cue:36:33
decimalListErrors.a.result: invalid type element 0 (string) of number list argument 0:
    ./in.cue:43:17

Result:
(_|_){
  // [eval]
  a1: (struct){
    a: (string){ &(=~"oo", =~"fo") }
    b: (string){ =~"oo" }
    c: (string){ =~"fo" }
  }
  a2: (struct){
    a: (string){ "foo" }
    b: (string){ =~"oo" }
    c: (string){ =~"fo" }
  }
  a3: (_|_){
    // [eval]
    a: (_|_){
      // [eval] a3.a: invalid value "bar" (out of bound =~"oo"):
      //     ./in.cue:8:5
      // a3.a: invalid value "bar" (out of bound =~"fo"):
      //     ./in.cue:9:5
    }
    b: (string){ =~"oo" }
    c: (string){ =~"fo" }
  }
  o1: (struct){
    a: (string){ |((string){ string }, (string){ "bar" }) }
    b: (string){ string }
    c: (string){ "bar" }
  }
  o2: (struct){
    a: (string){ "foo" }
    b: (string){ string }
    c: (string){ "bar" }
  }
  o3: (_|_){
    // [eval]
    a: (_|_){
      // [eval] o3.a: 2 errors in empty disjunction:
      // o3.a: conflicting values "bar" and "foo":
      //     ./in.cue:15:12
      //     ./in.cue:17:5
      //     ./in.cue:20:5
      //     ./in.cue:20:14
      // o3.a: conflicting values "baz" and "foo":
      //     ./in.cue:15:9
      //     ./in.cue:20:5
      //     ./in.cue:20:14
      //     ./in.cue:20:24
    }
    b: (string){ "baz" }
    c: (string){ "bar" }
  }
  stringListErrors: (_|_){
    // [eval]
    a: (struct){
      x: (list){
        0: (string){ string }
      }
      result: (_|_){
        // [incomplete] stringListErrors.a.result: non-concrete string value for element 0 of string list argument 0:
        //     ./in.cue:26:17
      }
    }
    b: (_|_){
      // [eval]
      x: (list){
        0: (int){ int }
      }
      result: (_|_){
        // [eval] stringListErrors.b.result: invalid type element 0 (int) of string list argument 0:
        //     ./in.cue:31:17
      }
    }
    c: (_|_){
      // [eval]
      x: (#list){
      }
      result: (_|_){
        // [eval] stringListErrors.c.result: cannot use int (type int) as string in argument 2 to strings.Join:
        //     ./in.cue:36:33
      }
    }
  }
  decimalListErrors: (_|_){
    // [eval]
    a: (_|_){
      // [eval]
      x: (#list){
        0: (string){ string }
      }
      result: (_|_){
        // [eval] decimalListErrors.a.result: invalid type element 0 (string) of number list argument 0:
        //     ./in.cue:43:17
      }
    }
    b: (struct){
      x: (list){
        0: (int){ int }
      }
      result: (_|_){
        // [incomplete] decimalListErrors.b.result: non-concrete number value for element 0 of number list argument 0:
        //     ./in.cue:48:17
      }
    }
  }
}
