// File: /workspace/github_c_makefile_star2_O0/chatziko-k08[P]lecture-code/tests/ADTMap_test.c
// Function: test_remove
void test_remove(void) {

	Map map = map_create(compare_ints, free, free);
	map_set_hash_function(map, hash_int);

	int N = 1000;
	int** key_array = malloc(N * sizeof(*key_array));
	int** value_array = malloc(N * sizeof(*value_array));

	for (int i = 0; i < N; i++) {
		key_array[i] = create_int(i);
		value_array[i] = create_int(i);

		map_insert(map, key_array[i], value_array[i]);
		// Ανά τακτά χρονικά διαστήματα διαγράφουμε κάποιο κλειδί που μόλις βάλαμε
		if (i % (N / 20) == 0) 
			TEST_ASSERT(map_remove(map, key_array[i]));
	}

	// Δοκιμάζουμε, πριν διαγράψουμε κανονικά τους κόμβους, ότι η map_remove
	// διαχειρίζεται σωστά ένα κλειδί που δεν υπάρχει στο Map
	int not_exists = 2000;
	TEST_ASSERT(!map_remove(map, &not_exists));

	// Διαγράφουμε όλους τους κόμβους και ελέγχουμε εάν η τιμή που μας επιστρέφει η map_remove είναι σωστή
	for (int i = 0; i < N; i++) {
		// (Αν δεν το έχουμε διαγράψει ήδη)
		if (i % (N / 20) != 0) {
			TEST_ASSERT(map_remove(map, key_array[i]));
		}
	}
	// Ελέγχουμε την συμπεριφορά της remove σε κάτι που έχει ήδη διαγραφεί.
	int key1 = 100;
	TEST_ASSERT(!map_remove(map, &key1));
	map_destroy(map);


	// Σειριακή εισαγωγή στοιχείων και αμέσως διαγραφή. Αυτό σε έναν πίνακα κατακερματισμού
	// μπορεί να προκαλέσει όλα τα κελιά να είναι μαρκαρισμένα ως DELETED.
	map = map_create(compare_ints, free, free);
	map_set_hash_function(map, hash_int);

	for (int i = 0; i < N; i++) {
		key_array[i] = create_int(i);
		value_array[i] = create_int(i);

		map_insert(map, key_array[i], value_array[i]);
		map_remove(map, key_array[i]);

		TEST_ASSERT(map_size(map) == 0);
	}
	map_destroy(map);

	free(key_array);
	free(value_array);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
leaq -0x5ef(%rip), %rdi      # 0x43a0
movq 0x762a(%rip), %rdx      # 0xbfc0
movq %rdx, %rsi
callq 0x5e20
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rdi
leaq 0x19a3(%rip), %rsi      # 0x6350
callq 0x6370
movl $0x3e8, -0xc(%rbp)      # imm = 0x3E8
movslq -0xc(%rbp), %rdi
shlq $0x3, %rdi
callq 0x2180
movq %rax, -0x18(%rbp)
movslq -0xc(%rbp), %rdi
shlq $0x3, %rdi
callq 0x2180
movq %rax, -0x20(%rbp)
movl $0x0, -0x24(%rbp)
movl -0x24(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x4ab6
movl -0x24(%rbp), %edi
callq 0x44a0
movq %rax, %rdx
movq -0x18(%rbp), %rax
movslq -0x24(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movl -0x24(%rbp), %edi
callq 0x44a0
movq %rax, %rdx
movq -0x20(%rbp), %rax
movslq -0x24(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movslq -0x24(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
movq -0x20(%rbp), %rax
movslq -0x24(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
callq 0x6000
movl -0x24(%rbp), %eax
movl %eax, -0x38(%rbp)
movl -0xc(%rbp), %eax
movl $0x14, %ecx
cltd
idivl %ecx
movl %eax, %ecx
movl -0x38(%rbp), %eax
cltd
idivl %ecx
cmpl $0x0, %edx
jne 0x4aa6
jmp 0x4a5d
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movslq -0x24(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
callq 0x6100
andb $0x1, %al
movzbl %al, %edi
leaq 0x3863(%rip), %rsi      # 0x82e1
movl $0x90, %edx
leaq 0x3b4d(%rip), %rcx      # 0x85d7
leaq 0x3914(%rip), %r8       # 0x83a5
movb $0x0, %al
callq 0x2370
cmpl $0x0, %eax
jne 0x4aa2
callq 0x2e50
jmp 0x4aa4
jmp 0x4aa6
jmp 0x4aa8
movl -0x24(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
jmp 0x49e2
movl $0x7d0, -0x28(%rbp)     # imm = 0x7D0
movq -0x8(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x6100
xorb $-0x1, %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x3809(%rip), %rsi      # 0x82e1
movl $0x96, %edx
leaq 0x3af3(%rip), %rcx      # 0x85d7
leaq 0x38d8(%rip), %r8       # 0x83c3
movb $0x0, %al
callq 0x2370
cmpl $0x0, %eax
jne 0x4afc
callq 0x2e50
jmp 0x4afe
movl $0x0, -0x2c(%rbp)
movl -0x2c(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x4b83
movl -0x2c(%rbp), %eax
movl %eax, -0x3c(%rbp)
movl -0xc(%rbp), %eax
movl $0x14, %ecx
cltd
idivl %ecx
movl %eax, %ecx
movl -0x3c(%rbp), %eax
cltd
idivl %ecx
cmpl $0x0, %edx
je 0x4b76
jmp 0x4b2d
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movslq -0x2c(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
callq 0x6100
andb $0x1, %al
movzbl %al, %edi
leaq 0x3793(%rip), %rsi      # 0x82e1
movl $0x9c, %edx
leaq 0x3a7d(%rip), %rcx      # 0x85d7
leaq 0x3844(%rip), %r8       # 0x83a5
movb $0x0, %al
callq 0x2370
cmpl $0x0, %eax
jne 0x4b72
callq 0x2e50
jmp 0x4b74
jmp 0x4b76
jmp 0x4b78
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
jmp 0x4b05
movl $0x64, -0x30(%rbp)
movq -0x8(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x6100
xorb $-0x1, %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x373c(%rip), %rsi      # 0x82e1
movl $0xa1, %edx
leaq 0x3a26(%rip), %rcx      # 0x85d7
leaq 0x3829(%rip), %r8       # 0x83e1
movb $0x0, %al
callq 0x2370
cmpl $0x0, %eax
jne 0x4bc9
callq 0x2e50
jmp 0x4bcb
movq -0x8(%rbp), %rdi
callq 0x61d0
leaq -0x83b(%rip), %rdi      # 0x43a0
movq 0x73de(%rip), %rdx      # 0xbfc0
movq %rdx, %rsi
callq 0x5e20
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rdi
leaq 0x1757(%rip), %rsi      # 0x6350
callq 0x6370
movl $0x0, -0x34(%rbp)
movl -0x34(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x4cc6
movl -0x34(%rbp), %edi
callq 0x44a0
movq %rax, %rdx
movq -0x18(%rbp), %rax
movslq -0x34(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movl -0x34(%rbp), %edi
callq 0x44a0
movq %rax, %rdx
movq -0x20(%rbp), %rax
movslq -0x34(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
movq -0x20(%rbp), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
callq 0x6000
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
callq 0x6100
movq -0x8(%rbp), %rdi
callq 0x5f70
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x3651(%rip), %rsi      # 0x82e1
movl $0xb1, %edx
leaq 0x393b(%rip), %rcx      # 0x85d7
leaq 0x3658(%rip), %r8       # 0x82fb
movb $0x0, %al
callq 0x2370
cmpl $0x0, %eax
jne 0x4cb4
callq 0x2e50
jmp 0x4cb6
jmp 0x4cb8
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0x4c05
movq -0x8(%rbp), %rdi
callq 0x61d0
movq -0x18(%rbp), %rdi
callq 0x2270
movq -0x20(%rbp), %rdi
callq 0x2270
addq $0x40, %rsp
popq %rbp
retq
nopw (%rax,%rax)