NAME map one key
PROG BEGIN { @map[16] = 32; @map[64] = 128; for ($kv : @map) { print($kv); } exit(); }
EXPECT (16, 32)
EXPECT (64, 128)

NAME map two keys
PROG BEGIN { @map[16,17] = 32; @map[64,65] = 128; for ($kv : @map) { print($kv); } exit(); }
EXPECT ((16, 17), 32)
EXPECT ((64, 65), 128)

NAME map one key elements
PROG BEGIN { @map[16] = 32; for ($kv : @map) { printf("key: %d, val: %d\n", $kv.0, $kv.1); } exit(); }
EXPECT key: 16, val: 32

NAME map two key elements
PROG BEGIN { @map[16,17] = 32; for ($kv : @map) { printf("key: (%d,%d), val: %d\n", $kv.0.0, $kv.0.1, $kv.1); } exit(); }
EXPECT key: (16,17), val: 32

NAME map strings
PROG BEGIN { @map["abc"] = "aa"; @map["def"] = "dd"; for ($kv : @map) { print($kv); } exit(); }
EXPECT (abc, aa)
EXPECT (def, dd)

NAME map create map in body
PROG BEGIN { @map[16] = 32; @map[64] = 128; for ($kv : @map) { @new[$kv.1] = $kv.0; } print(@new); exit(); }
EXPECT @new[32]: 16
EXPECT @new[128]: 64

NAME map multiple loops
PROG BEGIN { @mapA[16] = 32; @mapA[17] = 33; @mapB[64] = 128; @mapB[65] = 129; for ($kv : @mapA) { print($kv); } for ($kv : @mapB) { print($kv); } exit(); }
EXPECT (16, 32)
EXPECT (17, 33)
EXPECT (64, 128)
EXPECT (65, 129)

NAME map multiple probes
PROG BEGIN { @mapA[16] = 32; @mapA[17] = 33; @mapB[64] = 128; @mapB[65] = 129; for ($kv : @mapA) { print($kv); } exit(); } END { for ($kv : @mapB) { print($kv); } }
EXPECT (16, 32)
EXPECT (17, 33)
EXPECT (64, 128)
EXPECT (65, 129)

NAME map nested vals
PROG BEGIN { @mapA[16] = 32; @mapB[64] = 128; @mapB[65] = 129; for ($kv : @mapA) { print($kv); for ($kv2 : @mapB) { print($kv2); } } exit(); }
EXPECT (16, 32)
EXPECT (64, 128)
EXPECT (65, 129)

NAME map nested count
PROG BEGIN { @mapA[16] = 32; @mapA[17] = 33; @mapB[64] = 128; @mapB[65] = 129; @mapB[66] = 130; for ($kv : @mapA) { printf("A"); for ($kv2 : @mapB) { printf("B"); } } exit(); }
EXPECT ABBBABBB

NAME map delete
PROG BEGIN { @[0,0,0] = 1; @[0,0,1] = 1; @[0,1,0] = 1; @[1,0,0] = 1; for ($kv : @) { if ($kv.0.1 == 1) { delete(@, $kv.0); } } exit(); }
EXPECT @[0, 0, 0]: 1
EXPECT @[0, 0, 1]: 1
EXPECT @[1, 0, 0]: 1
EXPECT_NONE @[0, 1, 0]: 1

NAME variable context read only
PROG BEGIN { @map[0] = 0; $var = 123; for ($kv : @map) { print($var); } exit(); }
EXPECT 123

NAME variable context update
PROG BEGIN { @map[0] = 0; @map[1] = 1; $var = 123; for ($kv : @map) { print($var); $var *= 2; } print($var); exit(); }
EXPECT_REGEX ^123\n246\n492$

NAME variable context string
PROG BEGIN { @map[0] = 0; @map[1] = 1; $var = "abc"; for ($kv : @map) { print($var); $var = "def"; } print($var); exit(); }
EXPECT_REGEX ^abc\ndef\ndef$

NAME variable context multiple
PROG BEGIN { @map[0] = 0; $var1 = 123; $var2 = "abc"; for ($kv : @map) { print(($var1, $var2)); } exit(); }
EXPECT (123, abc)

NAME map two keys with a per cpu aggregation
PROG BEGIN { @map[16,17] = count(); @map[16,17] = count(); @map[1,2] = count(); for ($kv : @map) { print($kv); } exit(); }
EXPECT ((16, 17), 2)
EXPECT ((1, 2), 1)

NAME map stack key with a per cpu aggregation
PROG BEGIN { @map[kstack(raw)] = count(); for ($kv : @map) { print($kv.1); } exit(); }
EXPECT 1
