Website Summary Files Commits Branches @commit @diff @stats
path: root / assembler / src / parser
diff options
context:
space:
mode:
Commit8b65d8b6cf8ad44e7cae58bfda883567b8cc32fc (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-02-15 11:01:08 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-02-15 11:01:08 +0200
Files9c0ef14584e7493712d0f04fb955d813f7d56eae /assembler/src/parser
tonkobali-8b65d8b6cf8ad44e7cae58bfda883567b8cc32fc.tar
tonkobali-8b65d8b6cf8ad44e7cae58bfda883567b8cc32fc.tar.gz
tonkobali-8b65d8b6cf8ad44e7cae58bfda883567b8cc32fc.zip
Parenta6a5cf874fc03296c01bb72abdcb564e5d65ddcd (diff)
test(assembler): Add tests
2 files changed, 63 insertions, 0 deletions
-rw-r--r--assembler/src/parser/code_gen.rs29
-rw-r--r--assembler/src/parser/semantic.rs34
diff --git a/assembler/src/parser/code_gen.rs b/assembler/src/parser/code_gen.rs
index 2eaa34c..d183145 100644
--- a/assembler/src/parser/code_gen.rs
+++ b/assembler/src/parser/code_gen.rs
@@ -88,3 +88,32 @@ impl Program {
.collect()
}
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::lexer::Token;
+
+ #[test]
+ fn after_two_collapses_only_subleq_remains() {
+ let mut prog = Program::new(vec![
+ Token::Operator("rts".to_string()),
+ Token::Operator("jsr".to_string()),
+ Token::Address(1000),
+ Token::Operator("mov".to_string()),
+ Token::Address(1001),
+ Token::Address(1002),
+ Token::Operator("subleq".to_string()),
+ Token::Address(1001),
+ Token::Address(1002),
+ Token::Address(1001),
+
+ ], 10);
+ prog.collapse_instructions();
+ prog.collapse_instructions();
+
+ for i in prog.instructions {
+ assert_eq!(i.name, "subleq");
+ }
+ }
+}
diff --git a/assembler/src/parser/semantic.rs b/assembler/src/parser/semantic.rs
index 47ba201..438b2f1 100644
--- a/assembler/src/parser/semantic.rs
+++ b/assembler/src/parser/semantic.rs
@@ -21,3 +21,37 @@ impl Program {
}
}
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::lexer::Token;
+
+ #[test]
+ fn remove_definition_addresses_removes_symbols() {
+ let mut prog = Program::new(vec![
+ Token::SymbolDef("hello".to_string()),
+ Token::Number(1000),
+ Token::SymbolDef("world".to_string()),
+ Token::Number(64),
+ Token::Operator("jsr".to_string()),
+ Token::Symbol("hello".to_string()),
+ Token::Operator("mov".to_string()),
+ Token::Address(1001),
+ Token::Symbol("world".to_string()),
+ Token::Operator("subleq".to_string()),
+ Token::Symbol("hello".to_string()),
+ Token::Address(1002),
+ Token::Symbol("world".to_string()),
+
+ ], 10);
+ prog.remove_definition_addresses();
+
+ assert_eq!(prog.definitions.len(), 0);
+ for i in prog.instructions {
+ for arg in i.args {
+ assert!(! matches!(arg, Address::Definitions(_)));
+ }
+ }
+ }
+}