use assert_matches::assert_matches;
use etk_asm::ingest::{Error, Ingest};
use hex_literal::hex;
use std::path::{Path, PathBuf};
fn source
(paths: &[P]) -> PathBuf
where
P: AsRef,
{
let rel: PathBuf = paths.into_iter().collect();
let mut root = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
root.push("tests");
root.push("asm");
root.join(&rel)
}
#[test]
fn simple_constructor() -> Result<(), Error> {
let mut output = Vec::new();
let mut ingester = Ingest::new(&mut output);
ingester.ingest_file(source(&["simple-constructor", "ctor.etk"]))?;
assert_eq!(
output,
hex!(
"
5858600f01803803919082908239f36020601f537f0b68656c6c6f20776f
726c640000000000000000000000000000000000000000603f5260606000f3
"
),
);
Ok(())
}
#[test]
fn out_of_bounds() {
let mut output = Vec::new();
let mut ingester = Ingest::new(&mut output);
let err = ingester
.ingest_file(source(&["out-of-bounds", "main", "main.etk"]))
.unwrap_err();
assert_matches!(err, Error::DirectoryTraversal { .. });
}
#[test]
fn subdirectory() -> Result<(), Error> {
let mut output = Vec::new();
let mut ingester = Ingest::new(&mut output);
ingester.ingest_file(source(&["subdirectory", "main.etk"]))?;
assert_eq!(output, hex!("63c001c0de60ff"));
Ok(())
}
#[test]
fn variable_jump() -> Result<(), Error> {
let mut output = Vec::new();
let mut ingester = Ingest::new(&mut output);
ingester.ingest_file(source(&["variable-jump", "main.etk"]))?;
assert_eq!(output, hex!("6003565b"));
Ok(())
}
#[test]
fn instruction_macro() -> Result<(), Error> {
let mut output = Vec::new();
let mut ingester = Ingest::new(&mut output);
ingester.ingest_file(source(&["instruction-macro", "main.etk"]))?;
assert_eq!(
output,
hex!("5b5860005660406005600d601561000061004260086100006100426008")
);
Ok(())
}
#[test]
fn instruction_macro_with_empty_lines() -> Result<(), Error> {
let mut output = Vec::new();
let mut ingester = Ingest::new(&mut output);
ingester.ingest_file(source(&["instruction-macro", "empty_lines.etk"]))?;
assert_eq!(output, hex!("6000600060006000600060006000"));
Ok(())
}
#[test]
fn instruction_macro_with_two_instructions_per_line() {
let mut output = Vec::new();
let mut ingester = Ingest::new(&mut output);
let err = ingester
.ingest_file(source(&[
"instruction-macro",
"macro-with-2-instructions-per-line.etk",
]))
.unwrap_err();
assert_matches!(err, Error::Parse { .. });
}
#[test]
fn every_op() -> Result<(), Error> {
let mut output = Vec::new();
let mut ingester = Ingest::new(&mut output);
ingester.ingest_file(source(&["every-op", "main.etk"]))?;
assert_eq!(
output,
hex!(
"
00
01
02
03
04
05
06
07
08
09
0a
0b
10
11
12
13
14
15
16
17
18
19
1a
1b
1c
1d
20
30
31
32
33
34
35
36
37
38
39
3a
3b
3c
3d
3e
3f
40
41
42
43
44
45
46
47
48
50
51
52
53
54
55
56
57
58
59
5a
5b
60 aa
61 aabb
62 aabbcc
63 aabbccdd
64 aabbccddee
65 aabbccddeeff
66 aabbccddeeff00
67 aabbccddeeff0011
68 aabbccddeeff001122
69 aabbccddeeff00112233
6a aabbccddeeff0011223344
6b aabbccddeeff001122334455
6c aabbccddeeff00112233445566
6d aabbccddeeff0011223344556677
6e aabbccddeeff001122334455667788
6f aabbccddeeff00112233445566778899
70 aabbccddeeff00112233445566778899aa
71 aabbccddeeff00112233445566778899aabb
72 aabbccddeeff00112233445566778899aabbcc
73 aabbccddeeff00112233445566778899aabbccdd
74 aabbccddeeff00112233445566778899aabbccddee
75 aabbccddeeff00112233445566778899aabbccddeeff
76 aabbccddeeff00112233445566778899aabbccddeeff00
77 aabbccddeeff00112233445566778899aabbccddeeff0011
78 aabbccddeeff00112233445566778899aabbccddeeff001122
79 aabbccddeeff00112233445566778899aabbccddeeff00112233
7a aabbccddeeff00112233445566778899aabbccddeeff0011223344
7b aabbccddeeff00112233445566778899aabbccddeeff001122334455
7c aabbccddeeff00112233445566778899aabbccddeeff00112233445566
7d aabbccddeeff00112233445566778899aabbccddeeff0011223344556677
7e aabbccddeeff00112233445566778899aabbccddeeff001122334455667788
7f aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899
80
81
82
83
84
85
86
87
88
89
8a
8b
8c
8d
8e
8f
90
91
92
93
94
95
96
97
98
99
9a
9b
9c
9d
9e
9f
a0
a1
a2
a3
a4
f0
f1
f2
f3
f4
f5
fa
fd
fe
ff
"
)
);
Ok(())
}