# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.

cases:
  - note: all
    rego: |
      package test
      import future.keywords.in

      # Empty object
      x = {}

      # Single field
      y = {
        "a" : 5
      }

      # Multiple fields
      z = {
        "a" : 5,
        "b" : [ 1, 2, 3 ],
        "c" : { 4, 5, 6 },
        "d" : {
          "a" : 5,
          "b" : set()
          }
        # array as key
        , [1,
        2,
        3] : 4,

        # set as key
        { 1 } : 2,

        # Object as key
        {
            "a" : 1,
            "b" : 2, # Trailing comma
        } : `hello,
        world`

        # Null, boolean
        , null: false,
        true : true,

        # Only single var in is supported as value
        "p" : "q", "r" in "d" : "e"

      }
    policy:
      - spec:
          span: x = {}
          head:
            compr:
              span: x = {}
              refr:
                var: x
              assign:
                span: = {}
                op: =
                value:
                  object:
                    fields: []
          bodies: []
      - spec:
          head:
            compr:
              refr:
                var: y
              assign:
                op: =
                value:
                  object:
                    fields:
                      - key:
                          string: a
                        value:
                          number: 5
          bodies: []
      - spec:
          head:
            compr:
              refr:
                var: z
              assign:
                op: =
                value:
                  object:
                    fields:
                      - key:
                          string: a
                        value:
                          number: 5
                      - key:
                          string: b
                        value:
                          array:
                            - number: 1
                            - number: 2
                            - number: 3
                      - key:
                          string: c
                        value:
                          set:
                            - number: 4
                            - number: 5
                            - number : 6
                      - key:
                          string: d
                        value:
                          object:
                            fields:
                              - key:
                                  string: a
                                value:
                                  number: 5
                              - key:
                                  string: b
                                value:
                                  set: []
                      - key:
                          array:
                            - number: 1
                            - number: 2
                            - number: 3
                        value:
                          number: 4
                      - key:
                          set:
                            - number: 1
                        value:
                          number: 2
                      - key:
                          object:
                            fields:
                              - key:
                                  string: a
                                value:
                                  number: 1
                              - key:
                                  string: b
                                value:
                                  number: 2
                        value:
                          rawstring: "hello,\n  world"
                      - key: null
                        value: false
                      - key: true
                        value: true
                      - key:
                          string: p
                        value:
                          string: q
                      - key:
                          inexpr:
                            value:
                              string: r
                            collection:
                              string: d
                        value:
                          string: e

          bodies: []
