Add test
This commit is contained in:
parent
9cb6873618
commit
71a4f863e3
@ -137,6 +137,7 @@ impl Instruction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_destination(&mut self, destination: u8) {
|
pub fn set_destination(&mut self, destination: u8) {
|
||||||
|
self.0 &= 0x00FFFFFF;
|
||||||
self.0 |= (destination as u32) << 24;
|
self.0 |= (destination as u32) << 24;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -492,19 +493,17 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn add() {
|
fn add() {
|
||||||
let mut instruction = Instruction::add(0, 1, 2);
|
let mut instruction = Instruction::add(1, 1, 0);
|
||||||
|
|
||||||
instruction.set_operation(Operation::Add);
|
instruction.set_operation(Operation::Add);
|
||||||
|
|
||||||
instruction.set_first_argument_to_constant();
|
instruction.set_first_argument_to_constant();
|
||||||
instruction.set_second_argument_to_constant();
|
|
||||||
|
|
||||||
assert_eq!(instruction.operation(), Operation::Add);
|
assert_eq!(instruction.operation(), Operation::Add);
|
||||||
assert_eq!(instruction.destination(), 0);
|
assert_eq!(instruction.destination(), 1);
|
||||||
assert_eq!(instruction.first_argument(), 1);
|
assert_eq!(instruction.first_argument(), 1);
|
||||||
assert_eq!(instruction.second_argument(), 2);
|
assert_eq!(instruction.second_argument(), 0);
|
||||||
assert!(instruction.first_argument_is_constant());
|
assert!(instruction.first_argument_is_constant());
|
||||||
assert!(instruction.second_argument_is_constant());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -71,8 +71,6 @@ impl<'src> Parser<'src> {
|
|||||||
} else {
|
} else {
|
||||||
self.current_register += 1;
|
self.current_register += 1;
|
||||||
|
|
||||||
log::trace!("Incremented register to {}", self.current_register);
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -87,8 +85,6 @@ impl<'src> Parser<'src> {
|
|||||||
} else {
|
} else {
|
||||||
self.current_register -= 1;
|
self.current_register -= 1;
|
||||||
|
|
||||||
log::trace!("Decremented register to {}", self.current_register);
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -100,7 +96,7 @@ impl<'src> Parser<'src> {
|
|||||||
|
|
||||||
let (new_token, position) = self.lexer.next_token()?;
|
let (new_token, position) = self.lexer.next_token()?;
|
||||||
|
|
||||||
log::trace!("Advancing to token {new_token} at {position}");
|
log::trace!("Parsing token \"{new_token}\" at {position}");
|
||||||
|
|
||||||
self.previous_token = replace(&mut self.current_token, new_token);
|
self.previous_token = replace(&mut self.current_token, new_token);
|
||||||
self.previous_position = replace(&mut self.current_position, position);
|
self.previous_position = replace(&mut self.current_position, position);
|
||||||
@ -369,7 +365,6 @@ impl<'src> Parser<'src> {
|
|||||||
|
|
||||||
if let Some(register_index) = previous_register {
|
if let Some(register_index) = previous_register {
|
||||||
previous_instruction.set_destination(register_index);
|
previous_instruction.set_destination(register_index);
|
||||||
|
|
||||||
self.emit_instruction(previous_instruction, self.previous_position);
|
self.emit_instruction(previous_instruction, self.previous_position);
|
||||||
self.decrement_register()?;
|
self.decrement_register()?;
|
||||||
} else {
|
} else {
|
||||||
@ -379,13 +374,19 @@ impl<'src> Parser<'src> {
|
|||||||
self.previous_position,
|
self.previous_position,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
self.emit_instruction(previous_instruction, previous_position);
|
||||||
|
self.emit_instruction(
|
||||||
|
Instruction::set_local(self.current_register - 1, local_index),
|
||||||
|
start_position,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
self.increment_register()?;
|
||||||
self.emit_instruction(
|
self.emit_instruction(
|
||||||
Instruction::get_local(self.current_register, local_index),
|
Instruction::get_local(self.current_register, local_index),
|
||||||
self.previous_position,
|
self.previous_position,
|
||||||
);
|
);
|
||||||
self.increment_register()?;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -2,6 +2,23 @@ use crate::Local;
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn set_local() {
|
||||||
|
assert_eq!(
|
||||||
|
parse("let x = 41; x = 42;"),
|
||||||
|
Ok(Chunk::with_data(
|
||||||
|
vec![
|
||||||
|
(Instruction::load_constant(0, 0), Span(8, 10)),
|
||||||
|
(Instruction::declare_local(0, 0), Span(4, 5)),
|
||||||
|
(Instruction::load_constant(1, 1), Span(16, 18)),
|
||||||
|
(Instruction::set_local(1, 0), Span(12, 13)),
|
||||||
|
],
|
||||||
|
vec![Value::integer(41), Value::integer(42)],
|
||||||
|
vec![Local::new(Identifier::new("x"), 0, Some(0)),]
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parentheses_precedence() {
|
fn parentheses_precedence() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@ -51,7 +68,7 @@ fn add_multiply_precedence() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn let_statement() {
|
fn declare_local() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
parse("let x = 42;"),
|
parse("let x = 42;"),
|
||||||
Ok(Chunk::with_data(
|
Ok(Chunk::with_data(
|
||||||
|
Loading…
Reference in New Issue
Block a user