# Complex VM Control Flow Suite
# Exercises deep nesting of heterogeneous loops, comprehensions, and rule calls.

cases:
  - note: twenty_level_loop_maze
    description: Twenty levels of mixed loop modes with embedded comprehension and rule call
    literals:
      - 0
      - 1
    instruction_params:
      loop_params:
        - mode: "ForEach"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 10
          body_start: 5
          loop_end: 55
        - mode: "Any"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 11
          body_start: 6
          loop_end: 54
        - mode: "Every"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 12
          body_start: 7
          loop_end: 53
        - mode: "ForEach"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 13
          body_start: 8
          loop_end: 52
        - mode: "Any"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 14
          body_start: 9
          loop_end: 51
        - mode: "Every"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 15
          body_start: 10
          loop_end: 50
        - mode: "ForEach"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 16
          body_start: 11
          loop_end: 49
        - mode: "Any"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 17
          body_start: 12
          loop_end: 48
        - mode: "Every"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 18
          body_start: 13
          loop_end: 47
        - mode: "ForEach"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 19
          body_start: 14
          loop_end: 46
        - mode: "Any"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 20
          body_start: 15
          loop_end: 45
        - mode: "Every"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 21
          body_start: 16
          loop_end: 44
        - mode: "ForEach"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 22
          body_start: 17
          loop_end: 43
        - mode: "Any"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 23
          body_start: 18
          loop_end: 42
        - mode: "Every"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 24
          body_start: 19
          loop_end: 41
        - mode: "ForEach"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 25
          body_start: 20
          loop_end: 40
        - mode: "Any"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 26
          body_start: 21
          loop_end: 39
        - mode: "Every"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 27
          body_start: 22
          loop_end: 38
        - mode: "ForEach"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 28
          body_start: 23
          loop_end: 37
        - mode: "Any"
          collection: 1
          key_reg: 2
          value_reg: 3
          result_reg: 29
          body_start: 24
          loop_end: 36
        - mode: "ForEach"
          collection: 4
          key_reg: 30
          value_reg: 31
          result_reg: 32
          body_start: 28
          loop_end: 31
      comprehension_begin_params:
        - mode: "Array"
          collection_reg: 4
          key_reg: 30
          value_reg: 31
          body_start: 28
          comprehension_end: 31
    rule_infos:
      - rule_type: Complete
        definitions:
          - [56]
    instructions:
      - "ArrayNew { dest: 1 }"
      - "Load { dest: 8, literal_idx: 1 }"
      - "ArrayPush { arr: 1, value: 8 }"
      - "Load { dest: 7, literal_idx: 0 }"
      - "LoopStart { params_index: 0 }"
      - "LoopStart { params_index: 1 }"
      - "LoopStart { params_index: 2 }"
      - "LoopStart { params_index: 3 }"
      - "LoopStart { params_index: 4 }"
      - "LoopStart { params_index: 5 }"
      - "LoopStart { params_index: 6 }"
      - "LoopStart { params_index: 7 }"
      - "LoopStart { params_index: 8 }"
      - "LoopStart { params_index: 9 }"
      - "LoopStart { params_index: 10 }"
      - "LoopStart { params_index: 11 }"
      - "LoopStart { params_index: 12 }"
      - "LoopStart { params_index: 13 }"
      - "LoopStart { params_index: 14 }"
      - "LoopStart { params_index: 15 }"
      - "LoopStart { params_index: 16 }"
      - "LoopStart { params_index: 17 }"
      - "LoopStart { params_index: 18 }"
      - "LoopStart { params_index: 19 }"
      - "ArrayNew { dest: 4 }"
      - "ArrayPush { arr: 4, value: 8 }"
      - "ComprehensionBegin { params_index: 0 }"
      - "LoopStart { params_index: 20 }"
      - "Move { dest: 31, src: 8 }"
      - "ComprehensionYield { value_reg: 31 }"
      - "LoopNext { body_start: 28, loop_end: 31 }"
      - "ComprehensionEnd"
      - "Add { dest: 7, left: 7, right: 8 }"
      - "CallRule { dest: 9, rule_index: 0 }"
      - "Add { dest: 7, left: 7, right: 9 }"
      - "LoopNext { body_start: 24, loop_end: 36 }"
      - "LoopNext { body_start: 23, loop_end: 37 }"
      - "LoopNext { body_start: 22, loop_end: 38 }"
      - "LoopNext { body_start: 21, loop_end: 39 }"
      - "LoopNext { body_start: 20, loop_end: 40 }"
      - "LoopNext { body_start: 19, loop_end: 41 }"
      - "LoopNext { body_start: 18, loop_end: 42 }"
      - "LoopNext { body_start: 17, loop_end: 43 }"
      - "LoopNext { body_start: 16, loop_end: 44 }"
      - "LoopNext { body_start: 15, loop_end: 45 }"
      - "LoopNext { body_start: 14, loop_end: 46 }"
      - "LoopNext { body_start: 13, loop_end: 47 }"
      - "LoopNext { body_start: 12, loop_end: 48 }"
      - "LoopNext { body_start: 11, loop_end: 49 }"
      - "LoopNext { body_start: 10, loop_end: 50 }"
      - "LoopNext { body_start: 9, loop_end: 51 }"
      - "LoopNext { body_start: 8, loop_end: 52 }"
      - "LoopNext { body_start: 7, loop_end: 53 }"
      - "LoopNext { body_start: 6, loop_end: 54 }"
      - "LoopNext { body_start: 5, loop_end: 55 }"
      - "Return { value: 7 }"
      - "RuleInit { result_reg: 1, rule_index: 0 }"
      - "Load { dest: 1, literal_idx: 1 }"
      - "RuleReturn {}"
    want_result: 2
