// File: /workspace/github_c_makefile_star2_O0/chatziko-k08[P]lecture-code/tests/ADTList_test.c
// Function: test_remove_next
void test_remove_next(void) {
	// Δημιουργία λίστας που καλεί αυτόματα τη free σε κάθε στοιχείο που αφαιρείται
	List list = list_create(free);

	int N = 1000;
	int** array = malloc(N * sizeof(*array));					

	// Χρησιμοποιούμε την insert για να γεμίσουμε την λίστα, αφού την έχουμε δοκιμάσει ήδη στην test_insert()
	for (int i = 0; i < N; i++) {
		
		// Δημιουργούμε δυναμικά δεσμευμένα αντικείμενα για να δοκιμάσουμε την destroy_function
		array[i]  = malloc(sizeof(int));
		*array[i] = i;
		list_insert_next(list, LIST_BOF, array[i]);
	}


	for (int i = N - 1; i >= 0; i--) {
		// Διαγράφουμε απο την αρχή και ελέγχουμε εάν η τιμή του πρώτου κόμβου 
		// ήταν η ίδια με αυτή που κάναμε insert παραπάνω
		TEST_ASSERT(list_node_value(list, list_first(list)) == array[i]);
		list_remove_next(list, LIST_BOF);

		// Ελέγχουμε ότι ενημερώνεται (μειώνεται) το size/μέγεθος της λίστας
		TEST_ASSERT(list_size(list) == i);
	}

	// Ξαναγεμίζουμε την λίστα για να δοκιμάσουμε την διαγραφή απο ενδιάμεσο κόμβο
	for (int i = 0; i < N; i++) {
		array[i]  = malloc(sizeof(int));
		*array[i] = i;
		list_insert_next(list, LIST_BOF, array[i]);
	}	

	// Δοκιμάζουμε την διαγραφή κόμβων ενδιάμεσα της λίστας, και συγκεκριμένα του δεύτερου κόμβου απο την αρχή
	list_remove_next(list, list_first(list));
	TEST_ASSERT(list_size(list) == N - 1);

	list_destroy(list);
	free(array);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq 0x4931(%rip), %rdi      # 0x8fc0
callq 0x56c0
movq %rax, -0x8(%rbp)
movl $0x3e8, -0xc(%rbp)      # imm = 0x3E8
movslq -0xc(%rbp), %rdi
shlq $0x3, %rdi
callq 0x2180
movq %rax, -0x18(%rbp)
movl $0x0, -0x1c(%rbp)
movl -0x1c(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x470d
movl $0x4, %edi
callq 0x2180
movq %rax, %rdx
movq -0x18(%rbp), %rax
movslq -0x1c(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movl -0x1c(%rbp), %ecx
movq -0x18(%rbp), %rax
movslq -0x1c(%rbp), %rdx
movq (%rax,%rdx,8), %rax
movl %ecx, (%rax)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movslq -0x1c(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
xorl %eax, %eax
movl %eax, %esi
callq 0x5750
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1c(%rbp)
jmp 0x46b7
movl -0xc(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x20(%rbp)
cmpl $0x0, -0x20(%rbp)
jl 0x47de
jmp 0x4722
movq -0x8(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
callq 0x5a10
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x5ac0
movq -0x18(%rbp), %rcx
movslq -0x20(%rbp), %rdx
cmpq (%rcx,%rdx,8), %rax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x1b87(%rip), %rsi      # 0x62e1
movl $0x52, %edx
leaq 0x1e02(%rip), %rcx      # 0x6568
leaq 0x1c59(%rip), %r8       # 0x63c6
movb $0x0, %al
callq 0x2360
cmpl $0x0, %eax
jne 0x477e
callq 0x2e40
jmp 0x4780
movq -0x8(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x57e0
movq -0x8(%rbp), %rdi
callq 0x5730
cmpl -0x20(%rbp), %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x1b39(%rip), %rsi      # 0x62e1
movl $0x56, %edx
leaq 0x1db4(%rip), %rcx      # 0x6568
leaq 0x1c3f(%rip), %r8       # 0x63fa
movb $0x0, %al
callq 0x2360
cmpl $0x0, %eax
jne 0x47cc
callq 0x2e40
jmp 0x47ce
jmp 0x47d0
movl -0x20(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x20(%rbp)
jmp 0x4716
movl $0x0, -0x24(%rbp)
movl -0x24(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x483b
movl $0x4, %edi
callq 0x2180
movq %rax, %rdx
movq -0x18(%rbp), %rax
movslq -0x24(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movl -0x24(%rbp), %ecx
movq -0x18(%rbp), %rax
movslq -0x24(%rbp), %rdx
movq (%rax,%rdx,8), %rax
movl %ecx, (%rax)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movslq -0x24(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
xorl %eax, %eax
movl %eax, %esi
callq 0x5750
movl -0x24(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
jmp 0x47e5
movq -0x8(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
callq 0x5a10
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x57e0
movq -0x8(%rbp), %rdi
callq 0x5730
movl -0xc(%rbp), %ecx
subl $0x1, %ecx
cmpl %ecx, %eax
sete %al
andb $0x1, %al
movzbl %al, %edi
leaq 0x1a69(%rip), %rsi      # 0x62e1
movl $0x62, %edx
leaq 0x1ce4(%rip), %rcx      # 0x6568
leaq 0x1b84(%rip), %r8       # 0x640f
movb $0x0, %al
callq 0x2360
cmpl $0x0, %eax
jne 0x489c
callq 0x2e40
jmp 0x489e
movq -0x8(%rbp), %rdi
callq 0x5990
movq -0x18(%rbp), %rdi
callq 0x2260
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)