From c75e2995e7cc2b8e55a912dfbc9110d91cc1d762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Autin?= Date: Sun, 12 Mar 2023 00:22:16 +0100 Subject: [PATCH] Reworked unit tests for machine and renamed test_programs directory --- src/simulator/machine.rs | 72 ++++++------------ {test_programs => test}/.gitignore | 0 {test_programs => test}/Makefile | 0 {test_programs => test}/Makefile.config | 0 {test_programs => test}/Makefile.tests | 0 {test_programs => test}/README.md | 0 .../riscv_instructions/Makefile | 0 .../riscv_instructions/boolean_logic/Makefile | 0 .../boolean_logic/comparisons.c | 0 .../riscv_instructions/boolean_logic/if.c | 0 .../boolean_logic/new_comparisons.c | 0 .../riscv_instructions/boolean_logic/switch.c | 0 .../jump_instructions/Makefile | 0 .../jump_instructions/jump.c | 0 .../jump_instructions/ret.c | 0 .../simple_arithmetics/Makefile | 0 .../simple_arithmetics/README.md | 0 .../simple_arithmetics/unsigned_addition.c | 0 .../simple_arithmetics/unsigned_division.c | 0 .../unsigned_multiplication.c | 0 .../unsigned_substraction.c | 0 {test_programs => test}/userlib/Makefile | 0 {test_programs => test}/userlib/ldscript.lds | 0 {test_programs => test}/userlib/libnachos.c | 0 {test_programs => test}/userlib/libnachos.h | 0 {test_programs => test}/userlib/sys.s | 0 {test_programs => test}/userlib/syscall.h | 0 test_programs/userlib/libnachos.o | Bin 15488 -> 0 bytes test_programs/userlib/sys.o | Bin 3624 -> 0 bytes 29 files changed, 24 insertions(+), 48 deletions(-) rename {test_programs => test}/.gitignore (100%) rename {test_programs => test}/Makefile (100%) rename {test_programs => test}/Makefile.config (100%) rename {test_programs => test}/Makefile.tests (100%) rename {test_programs => test}/README.md (100%) rename {test_programs => test}/riscv_instructions/Makefile (100%) rename {test_programs => test}/riscv_instructions/boolean_logic/Makefile (100%) rename {test_programs => test}/riscv_instructions/boolean_logic/comparisons.c (100%) rename {test_programs => test}/riscv_instructions/boolean_logic/if.c (100%) rename {test_programs => test}/riscv_instructions/boolean_logic/new_comparisons.c (100%) rename {test_programs => test}/riscv_instructions/boolean_logic/switch.c (100%) rename {test_programs => test}/riscv_instructions/jump_instructions/Makefile (100%) rename {test_programs => test}/riscv_instructions/jump_instructions/jump.c (100%) rename {test_programs => test}/riscv_instructions/jump_instructions/ret.c (100%) rename {test_programs => test}/riscv_instructions/simple_arithmetics/Makefile (100%) rename {test_programs => test}/riscv_instructions/simple_arithmetics/README.md (100%) rename {test_programs => test}/riscv_instructions/simple_arithmetics/unsigned_addition.c (100%) rename {test_programs => test}/riscv_instructions/simple_arithmetics/unsigned_division.c (100%) rename {test_programs => test}/riscv_instructions/simple_arithmetics/unsigned_multiplication.c (100%) rename {test_programs => test}/riscv_instructions/simple_arithmetics/unsigned_substraction.c (100%) rename {test_programs => test}/userlib/Makefile (100%) rename {test_programs => test}/userlib/ldscript.lds (100%) rename {test_programs => test}/userlib/libnachos.c (100%) rename {test_programs => test}/userlib/libnachos.h (100%) rename {test_programs => test}/userlib/sys.s (100%) rename {test_programs => test}/userlib/syscall.h (100%) delete mode 100644 test_programs/userlib/libnachos.o delete mode 100644 test_programs/userlib/sys.o diff --git a/src/simulator/machine.rs b/src/simulator/machine.rs index 357b837..710b11a 100644 --- a/src/simulator/machine.rs +++ b/src/simulator/machine.rs @@ -729,15 +729,12 @@ mod test { #[test] fn test_comp() { let mut m = Machine::init_machine(); - let path_before = "memoryComp.txt".to_string(); - let path_after = "memoryCompEnd.txt".to_string(); - let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap(); - let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap(); + let memory_before = mem_cmp::MemChecker::from("test/machine/memoryComp.txt").unwrap(); + let memory_after = mem_cmp::MemChecker::from("test/machine/memoryCompEnd.txt").unwrap(); mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m); Machine::run(&mut m); - let path_trace = "memoryCompTrace.txt".to_string(); - let expected_trace = fs::read_to_string(path_trace).unwrap(); + let expected_trace = fs::read_to_string("test/machine/memoryCompTrace.txt").unwrap(); assert!(mem_cmp::MemChecker::compare_machine_memory(&memory_after, &m)); assert!(expected_trace.contains(m.registers_trace.as_str())); @@ -746,15 +743,12 @@ mod test { #[test] fn test_div() { let mut m = Machine::init_machine(); - let path_before = "memoryDiv.txt"; - let path_after = "memoryDivEnd.txt"; - let memory_before = mem_cmp::MemChecker::from(path_before).unwrap(); - let memory_after = mem_cmp::MemChecker::from(path_after).unwrap(); + let memory_before = mem_cmp::MemChecker::from("test/machine/memoryDiv.txt").unwrap(); + let memory_after = mem_cmp::MemChecker::from("test/machine/memoryDivEnd.txt").unwrap(); mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m); Machine::run(&mut m); - let path_trace = "memoryDivTrace.txt".to_string(); - let expected_trace = fs::read_to_string(path_trace).unwrap(); + let expected_trace = fs::read_to_string("test/machine/memoryDivTrace.txt").unwrap(); assert!(mem_cmp::MemChecker::compare_machine_memory(&memory_after, &m)); assert!(expected_trace.contains(m.registers_trace.as_str())); @@ -763,15 +757,12 @@ mod test { #[test] fn test_if() { let mut m = Machine::init_machine(); - let path_before = "memoryIf.txt".to_string(); - let path_after = "memoryIfEnd.txt".to_string(); - let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap(); - let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap(); + let memory_before = mem_cmp::MemChecker::from("test/machine/memoryIf.txt").unwrap(); + let memory_after = mem_cmp::MemChecker::from("test/machine/memoryIfEnd.txt").unwrap(); mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m); Machine::run(&mut m); - let path_trace = "memoryIfTrace.txt".to_string(); - let expected_trace = fs::read_to_string(path_trace).unwrap(); + let expected_trace = fs::read_to_string("test/machine/memoryIfTrace.txt").unwrap(); assert!(mem_cmp::MemChecker::compare_machine_memory(&memory_after, &m)); assert!(expected_trace.contains(m.registers_trace.as_str())); @@ -780,15 +771,12 @@ mod test { #[test] fn test_jump() { let mut m = Machine::init_machine(); - let path_before = "memoryJump.txt".to_string(); - let path_after = "memoryJumpEnd.txt".to_string(); - let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap(); - let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap(); + let memory_before = mem_cmp::MemChecker::from("test/machine/memoryJump.txt").unwrap(); + let memory_after = mem_cmp::MemChecker::from("test/machine/memoryJumpEnd.txt").unwrap(); mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m); Machine::run(&mut m); - let path_trace = "memoryJumpTrace.txt".to_string(); - let expected_trace = fs::read_to_string(path_trace).unwrap(); + let expected_trace = fs::read_to_string("test/machine/memoryJumpTrace.txt").unwrap(); assert!(mem_cmp::MemChecker::compare_machine_memory(&memory_after, &m)); assert!(expected_trace.contains(m.registers_trace.as_str())); @@ -797,15 +785,12 @@ mod test { #[test] fn test_mul() { let mut m = Machine::init_machine(); - let path_before = "memoryMul.txt".to_string(); - let path_after = "memoryMulEnd.txt".to_string(); - let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap(); - let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap(); + let memory_before = mem_cmp::MemChecker::from("test/machine/memoryMul.txt").unwrap(); + let memory_after = mem_cmp::MemChecker::from("test/machine/memoryMulEnd.txt").unwrap(); mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m); Machine::run(&mut m); - let path_trace = "memoryMulTrace.txt".to_string(); - let expected_trace = fs::read_to_string(path_trace).unwrap(); + let expected_trace = fs::read_to_string("test/machine/memoryMulTrace.txt").unwrap(); assert!(mem_cmp::MemChecker::compare_machine_memory(&memory_after, &m)); assert!(expected_trace.contains(m.registers_trace.as_str())); @@ -814,15 +799,12 @@ mod test { #[test] fn test_ret() { let mut m = Machine::init_machine(); - let path_before = "memoryRet.txt".to_string(); - let path_after = "memoryRetEnd.txt".to_string(); - let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap(); - let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap(); + let memory_before = mem_cmp::MemChecker::from("test/machine/memoryRet.txt").unwrap(); + let memory_after = mem_cmp::MemChecker::from("test/machine/memoryRetEnd.txt").unwrap(); mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m); Machine::run(&mut m); - let path_trace = "memoryRetTrace.txt".to_string(); - let expected_trace = fs::read_to_string(path_trace).unwrap(); + let expected_trace = fs::read_to_string("test/machine/memoryRetTrace.txt").unwrap(); assert!(mem_cmp::MemChecker::compare_machine_memory(&memory_after, &m)); assert!(expected_trace.contains(m.registers_trace.as_str())); @@ -831,15 +813,12 @@ mod test { #[test] fn test_sub() { let mut m = Machine::init_machine(); - let path_before = "memorySub.txt".to_string(); - let path_after = "memorySubEnd.txt".to_string(); - let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap(); - let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap(); + let memory_before = mem_cmp::MemChecker::from("test/machine/memorySub.txt").unwrap(); + let memory_after = mem_cmp::MemChecker::from("test/machine/memorySubEnd.txt").unwrap(); mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m); Machine::run(&mut m); - let path_trace = "memorySubTrace.txt".to_string(); - let expected_trace = fs::read_to_string(path_trace).unwrap(); + let expected_trace = fs::read_to_string("test/machine/memorySubTrace.txt").unwrap(); assert!(mem_cmp::MemChecker::compare_machine_memory(&memory_after, &m)); assert!(expected_trace.contains(m.registers_trace.as_str())); @@ -848,15 +827,12 @@ mod test { #[test] fn test_switch() { let mut m = Machine::init_machine(); - let path_before = "memorySwitch.txt".to_string(); - let path_after = "memorySwitchEnd.txt".to_string(); - let memory_before = mem_cmp::MemChecker::from(&path_before).unwrap(); - let memory_after = mem_cmp::MemChecker::from(&path_after).unwrap(); + let memory_before = mem_cmp::MemChecker::from("test/machine/memorySwitch.txt").unwrap(); + let memory_after = mem_cmp::MemChecker::from("test/machine/memorySwitchEnd.txt").unwrap(); mem_cmp::MemChecker::fill_memory_from_mem_checker(&memory_before, &mut m); Machine::run(&mut m); - let path_trace = "memorySwitchTrace.txt".to_string(); - let expected_trace = fs::read_to_string(path_trace).unwrap(); + let expected_trace = fs::read_to_string("test/machine/memorySwitchTrace.txt").unwrap(); assert!(mem_cmp::MemChecker::compare_machine_memory(&memory_after, &m)); assert!(expected_trace.contains(m.registers_trace.as_str())); diff --git a/test_programs/.gitignore b/test/.gitignore similarity index 100% rename from test_programs/.gitignore rename to test/.gitignore diff --git a/test_programs/Makefile b/test/Makefile similarity index 100% rename from test_programs/Makefile rename to test/Makefile diff --git a/test_programs/Makefile.config b/test/Makefile.config similarity index 100% rename from test_programs/Makefile.config rename to test/Makefile.config diff --git a/test_programs/Makefile.tests b/test/Makefile.tests similarity index 100% rename from test_programs/Makefile.tests rename to test/Makefile.tests diff --git a/test_programs/README.md b/test/README.md similarity index 100% rename from test_programs/README.md rename to test/README.md diff --git a/test_programs/riscv_instructions/Makefile b/test/riscv_instructions/Makefile similarity index 100% rename from test_programs/riscv_instructions/Makefile rename to test/riscv_instructions/Makefile diff --git a/test_programs/riscv_instructions/boolean_logic/Makefile b/test/riscv_instructions/boolean_logic/Makefile similarity index 100% rename from test_programs/riscv_instructions/boolean_logic/Makefile rename to test/riscv_instructions/boolean_logic/Makefile diff --git a/test_programs/riscv_instructions/boolean_logic/comparisons.c b/test/riscv_instructions/boolean_logic/comparisons.c similarity index 100% rename from test_programs/riscv_instructions/boolean_logic/comparisons.c rename to test/riscv_instructions/boolean_logic/comparisons.c diff --git a/test_programs/riscv_instructions/boolean_logic/if.c b/test/riscv_instructions/boolean_logic/if.c similarity index 100% rename from test_programs/riscv_instructions/boolean_logic/if.c rename to test/riscv_instructions/boolean_logic/if.c diff --git a/test_programs/riscv_instructions/boolean_logic/new_comparisons.c b/test/riscv_instructions/boolean_logic/new_comparisons.c similarity index 100% rename from test_programs/riscv_instructions/boolean_logic/new_comparisons.c rename to test/riscv_instructions/boolean_logic/new_comparisons.c diff --git a/test_programs/riscv_instructions/boolean_logic/switch.c b/test/riscv_instructions/boolean_logic/switch.c similarity index 100% rename from test_programs/riscv_instructions/boolean_logic/switch.c rename to test/riscv_instructions/boolean_logic/switch.c diff --git a/test_programs/riscv_instructions/jump_instructions/Makefile b/test/riscv_instructions/jump_instructions/Makefile similarity index 100% rename from test_programs/riscv_instructions/jump_instructions/Makefile rename to test/riscv_instructions/jump_instructions/Makefile diff --git a/test_programs/riscv_instructions/jump_instructions/jump.c b/test/riscv_instructions/jump_instructions/jump.c similarity index 100% rename from test_programs/riscv_instructions/jump_instructions/jump.c rename to test/riscv_instructions/jump_instructions/jump.c diff --git a/test_programs/riscv_instructions/jump_instructions/ret.c b/test/riscv_instructions/jump_instructions/ret.c similarity index 100% rename from test_programs/riscv_instructions/jump_instructions/ret.c rename to test/riscv_instructions/jump_instructions/ret.c diff --git a/test_programs/riscv_instructions/simple_arithmetics/Makefile b/test/riscv_instructions/simple_arithmetics/Makefile similarity index 100% rename from test_programs/riscv_instructions/simple_arithmetics/Makefile rename to test/riscv_instructions/simple_arithmetics/Makefile diff --git a/test_programs/riscv_instructions/simple_arithmetics/README.md b/test/riscv_instructions/simple_arithmetics/README.md similarity index 100% rename from test_programs/riscv_instructions/simple_arithmetics/README.md rename to test/riscv_instructions/simple_arithmetics/README.md diff --git a/test_programs/riscv_instructions/simple_arithmetics/unsigned_addition.c b/test/riscv_instructions/simple_arithmetics/unsigned_addition.c similarity index 100% rename from test_programs/riscv_instructions/simple_arithmetics/unsigned_addition.c rename to test/riscv_instructions/simple_arithmetics/unsigned_addition.c diff --git a/test_programs/riscv_instructions/simple_arithmetics/unsigned_division.c b/test/riscv_instructions/simple_arithmetics/unsigned_division.c similarity index 100% rename from test_programs/riscv_instructions/simple_arithmetics/unsigned_division.c rename to test/riscv_instructions/simple_arithmetics/unsigned_division.c diff --git a/test_programs/riscv_instructions/simple_arithmetics/unsigned_multiplication.c b/test/riscv_instructions/simple_arithmetics/unsigned_multiplication.c similarity index 100% rename from test_programs/riscv_instructions/simple_arithmetics/unsigned_multiplication.c rename to test/riscv_instructions/simple_arithmetics/unsigned_multiplication.c diff --git a/test_programs/riscv_instructions/simple_arithmetics/unsigned_substraction.c b/test/riscv_instructions/simple_arithmetics/unsigned_substraction.c similarity index 100% rename from test_programs/riscv_instructions/simple_arithmetics/unsigned_substraction.c rename to test/riscv_instructions/simple_arithmetics/unsigned_substraction.c diff --git a/test_programs/userlib/Makefile b/test/userlib/Makefile similarity index 100% rename from test_programs/userlib/Makefile rename to test/userlib/Makefile diff --git a/test_programs/userlib/ldscript.lds b/test/userlib/ldscript.lds similarity index 100% rename from test_programs/userlib/ldscript.lds rename to test/userlib/ldscript.lds diff --git a/test_programs/userlib/libnachos.c b/test/userlib/libnachos.c similarity index 100% rename from test_programs/userlib/libnachos.c rename to test/userlib/libnachos.c diff --git a/test_programs/userlib/libnachos.h b/test/userlib/libnachos.h similarity index 100% rename from test_programs/userlib/libnachos.h rename to test/userlib/libnachos.h diff --git a/test_programs/userlib/sys.s b/test/userlib/sys.s similarity index 100% rename from test_programs/userlib/sys.s rename to test/userlib/sys.s diff --git a/test_programs/userlib/syscall.h b/test/userlib/syscall.h similarity index 100% rename from test_programs/userlib/syscall.h rename to test/userlib/syscall.h diff --git a/test_programs/userlib/libnachos.o b/test_programs/userlib/libnachos.o deleted file mode 100644 index 26f4ccaceb20d8eedc82ca547f5f92ffa2644878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15488 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