// File: /workspace/github_c_makefile_star2_O0/chatziko-k08[P]lecture-code/tests/ADTMap_test.c
// Function: test_iterate
void test_iterate(void) {
	Map map = map_create(compare_ints, free, free);
	map_set_hash_function(map, hash_int);
	// first σε κενό map
	TEST_ASSERT(map_first(map) == MAP_EOF);
	// Προσθέτουμε Ν ακεραίους, το value κάθε ακεραίου i είναι 2*i
	int N = 1000;
	for (int i = 0; i < N; i++)
		map_insert(map, create_int(i), create_int(2*i));

	// Ελέγχουμε ότι διατρέχοντας το map βρίσκουμε όλους τους ακεραίους από μία φορά τον καθένα
	// Στον πίνακα seen κρατάμε αν έχουμε ήδη δει τον κάθε αριθμό
	bool seen[N];
	for (int i = 0; i < N; i++)
		seen[i] = false;

	int count = 0;
	for (MapNode node = map_first(map); node != MAP_EOF; node = map_next(map, node)) {
		int* key = map_node_key(map, node);
		int* value = map_node_value(map, node);

		TEST_ASSERT(*key >= 0 && *key < N && !seen[*key]);
		TEST_ASSERT(*value == 2 * *key);

		seen[*key] = true;
		count++;
	}

	// Αν κάναμε N επαναλήψεις, τότε σίγουρα βρήκαμε όλους τους αριθμούς
	TEST_ASSERT(count == N);

	map_destroy(map);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
leaq -0xcff(%rip), %rdi      # 0x43a0
movq 0x6f1a(%rip), %rdx      # 0xbfc0
movq %rdx, %rsi
callq 0x5e20
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rdi
leaq 0x1293(%rip), %rsi      # 0x6350
callq 0x6370
movq -0x8(%rbp), %rdi
callq 0x6240
cmpq $0x0, %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x3203(%rip), %rsi      # 0x82e1
movl $0xed, %edx
leaq 0x34ed(%rip), %rcx      # 0x85d7
leaq 0x33e2(%rip), %r8       # 0x84d3
movb $0x0, %al
callq 0x2370
cmpl $0x0, %eax
jne 0x5102
callq 0x2e50
jmp 0x5104
movl $0x3e8, -0xc(%rbp)      # imm = 0x3E8
movl $0x0, -0x10(%rbp)
movl -0x10(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x5153
movq -0x8(%rbp), %rax
movq %rax, -0x50(%rbp)
movl -0x10(%rbp), %edi
callq 0x44a0
movq %rax, -0x48(%rbp)
movl -0x10(%rbp), %edi
shll %edi
callq 0x44a0
movq -0x50(%rbp), %rdi
movq -0x48(%rbp), %rsi
movq %rax, %rdx
callq 0x6000
movl -0x10(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x10(%rbp)
jmp 0x5112
movl -0xc(%rbp), %eax
movq %rsp, %rcx
movq %rcx, -0x18(%rbp)
movq %rax, %rdx
addq $0xf, %rdx
andq $-0x10, %rdx
movq %rsp, %rcx
subq %rdx, %rcx
movq %rcx, -0x58(%rbp)
movq %rcx, %rsp
movq %rax, -0x20(%rbp)
movl $0x0, -0x24(%rbp)
movl -0x24(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x519f
movq -0x58(%rbp), %rax
movslq -0x24(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movl -0x24(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
jmp 0x5180
movl $0x0, -0x28(%rbp)
movq -0x8(%rbp), %rdi
callq 0x6240
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x52bf
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x6300
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x6320
movq %rax, -0x40(%rbp)
movq -0x38(%rbp), %rcx
xorl %eax, %eax
cmpl $0x0, (%rcx)
movb %al, -0x59(%rbp)
jl 0x5211
movq -0x38(%rbp), %rax
movl (%rax), %ecx
xorl %eax, %eax
cmpl -0xc(%rbp), %ecx
movb %al, -0x59(%rbp)
jge 0x5211
movq -0x58(%rbp), %rax
movq -0x38(%rbp), %rcx
movslq (%rcx), %rcx
movb (%rax,%rcx), %al
xorb $-0x1, %al
movb %al, -0x59(%rbp)
movb -0x59(%rbp), %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x30c1(%rip), %rsi      # 0x82e1
movl $0xfe, %edx
leaq 0x33ab(%rip), %rcx      # 0x85d7
leaq 0x32ba(%rip), %r8       # 0x84ed
movb $0x0, %al
callq 0x2370
cmpl $0x0, %eax
jne 0x5244
callq 0x2e50
jmp 0x5246
jmp 0x5248
jmp 0x524a
movq -0x40(%rbp), %rax
movl (%rax), %eax
movq -0x38(%rbp), %rcx
movl (%rcx), %ecx
shll %ecx
cmpl %ecx, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x3078(%rip), %rsi      # 0x82e1
movl $0xff, %edx
leaq 0x3362(%rip), %rcx      # 0x85d7
leaq 0x3296(%rip), %r8       # 0x8512
movb $0x0, %al
callq 0x2370
cmpl $0x0, %eax
jne 0x528d
callq 0x2e50
jmp 0x528f
jmp 0x5291
movq -0x58(%rbp), %rax
movq -0x38(%rbp), %rcx
movslq (%rcx), %rcx
movb $0x1, (%rax,%rcx)
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x6290
movq %rax, -0x30(%rbp)
jmp 0x51b3
jmp 0x52c1
movl -0x28(%rbp), %eax
cmpl -0xc(%rbp), %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x300b(%rip), %rsi      # 0x82e1
movl $0x106, %edx            # imm = 0x106
leaq 0x32f5(%rip), %rcx      # 0x85d7
leaq 0x323c(%rip), %r8       # 0x8525
movb $0x0, %al
callq 0x2370
cmpl $0x0, %eax
jne 0x52fa
callq 0x2e50
jmp 0x52fc
jmp 0x52fe
movq -0x8(%rbp), %rdi
callq 0x61d0
movq -0x18(%rbp), %rax
movq %rax, %rsp
movq %rbp, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)