Skip to content

Commit 97b9b45

Browse files
committed
added major test case
1 parent fec22ae commit 97b9b45

2 files changed

Lines changed: 147 additions & 2 deletions

File tree

src/lexericals/lexer.rs

Lines changed: 143 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,34 @@ impl Lexer {
5959
Token::new(Tokenkind::Bang, "!".to_string())
6060
}
6161
}
62+
'|' => {
63+
self.read_token(); // Read the next character to check for '||'
64+
if self.ch == '|' {
65+
Token::new(Tokenkind::OR, "||".to_string())
66+
} else {
67+
Token::new(Tokenkind::Illegal, "|".to_string())
68+
}
69+
},
6270
'*' => Token::new(Tokenkind::Asterisk, self.ch.to_string()),
6371
'/' => Token::new(Tokenkind::Slash, self.ch.to_string()),
6472
'%' => Token::new(Tokenkind::Pencentage, self.ch.to_string()),
65-
'<' => Token::new(Tokenkind::Lthan, self.ch.to_string()),
66-
'>' => Token::new(Tokenkind::Gthan, self.ch.to_string()),
73+
'<' => {
74+
self.read_token(); // Read the next character to check for '<='
75+
if self.ch == '=' {
76+
Token::new(Tokenkind::Lthanoreq, "<=".to_string())
77+
} else {
78+
Token::new(Tokenkind::Lthan, "<".to_string())
79+
}
80+
81+
},
82+
'>' =>{
83+
self.read_token(); // Read the next character to check for '>='
84+
if self.ch == '=' {
85+
Token::new(Tokenkind::Gthanoreq, ">=".to_string())
86+
} else {
87+
Token::new(Tokenkind::Gthan, ">".to_string())
88+
}
89+
},
6790
'&' => {
6891
self.read_token(); // Read the next character to check for '&&'
6992
if self.ch == '&' {
@@ -215,4 +238,122 @@ mod test {
215238
); // Move to the next character
216239
}
217240
}
241+
#[test]
242+
fn test_skip_whitespace() {
243+
let input = " let five = 5; \n let ten = 10;";
244+
let mut lexer = Lexer::new(input);
245+
let token1 = lexer.next_token();
246+
assert_eq!(token1.kind, Tokenkind::Let);
247+
assert_eq!(token1.literal, "let");
248+
}
249+
250+
#[test]
251+
fn test_read_number() {
252+
let input = "12345 67890 12.34 56.78";
253+
let mut lexer = Lexer::new(input);
254+
let token1 = lexer.next_token();
255+
assert_eq!(token1.kind, Tokenkind::Int);
256+
assert_eq!(token1.literal, "12345");
257+
}
258+
#[test]
259+
fn test_read_float() {
260+
let input = "0.34 56.78";
261+
let mut lexer = Lexer::new(input);
262+
let token1 = lexer.next_token();
263+
assert_eq!(token1.kind, Tokenkind::Float);
264+
assert_eq!(token1.literal, "0.34");
265+
266+
let token2 = lexer.next_token();
267+
assert_eq!(token2.kind, Tokenkind::Float);
268+
assert_eq!(token2.literal, "56.78");
269+
}
270+
#[test]
271+
fn test_read_keywords() {
272+
let input = "let fn if else return";
273+
let mut lexer = Lexer::new(input);
274+
let token1 = lexer.next_token();
275+
assert_eq!(token1.kind, Tokenkind::Let);
276+
assert_eq!(token1.literal, "let");
277+
278+
let token2 = lexer.next_token();
279+
assert_eq!(token2.kind, Tokenkind::Function);
280+
assert_eq!(token2.literal, "fn");
281+
282+
let token3 = lexer.next_token();
283+
assert_eq!(token3.kind, Tokenkind::If);
284+
assert_eq!(token3.literal, "if");
285+
286+
let token4 = lexer.next_token();
287+
assert_eq!(token4.kind, Tokenkind::Else);
288+
assert_eq!(token4.literal, "else");
289+
290+
let token5 = lexer.next_token();
291+
assert_eq!(token5.kind, Tokenkind::Return);
292+
assert_eq!(token5.literal, "return");
293+
294+
}
295+
#[test]
296+
fn test_read_identifiers() {
297+
let input = "variable_name anotherVariable _privateVar";
298+
let mut lexer = Lexer::new(input);
299+
let token1 = lexer.next_token();
300+
assert_eq!(token1.kind, Tokenkind::Ident);
301+
assert_eq!(token1.literal, "variable_name");
302+
let token2 = lexer.next_token();
303+
assert_eq!(token2.kind, Tokenkind::Ident);
304+
assert_eq!(token2.literal, "anotherVariable");
305+
let token3 = lexer.next_token();
306+
assert_eq!(token3.kind, Tokenkind::Ident);
307+
assert_eq!(token3.literal, "_privateVar");
308+
}
309+
#[test]
310+
fn test_read_operators() {
311+
let input = "+ - * / % < > && || ! = == != >= <= ";
312+
let mut lexer = Lexer::new(input);
313+
let token1 = lexer.next_token();
314+
assert_eq!(token1.kind, Tokenkind::Plus);
315+
assert_eq!(token1.literal, "+");
316+
let token2 = lexer.next_token();
317+
assert_eq!(token2.kind, Tokenkind::Minus);
318+
assert_eq!(token2.literal, "-");
319+
let token3 = lexer.next_token();
320+
assert_eq!(token3.kind, Tokenkind::Asterisk);
321+
assert_eq!(token3.literal, "*");
322+
let token4 = lexer.next_token();
323+
assert_eq!(token4.kind, Tokenkind::Slash);
324+
assert_eq!(token4.literal, "/");
325+
let token5 = lexer.next_token();
326+
assert_eq!(token5.kind, Tokenkind::Pencentage);
327+
assert_eq!(token5.literal, "%");
328+
let token6 = lexer.next_token();
329+
assert_eq!(token6.kind, Tokenkind::Lthan);
330+
assert_eq!(token6.literal, "<");
331+
let token7 = lexer.next_token();
332+
assert_eq!(token7.kind, Tokenkind::Gthan);
333+
assert_eq!(token7.literal, ">");
334+
let token8 = lexer.next_token();
335+
assert_eq!(token8.kind, Tokenkind::And);
336+
assert_eq!(token8.literal, "&&");
337+
let token9 = lexer.next_token();
338+
assert_eq!(token9.kind, Tokenkind::OR);
339+
assert_eq!(token9.literal, "||");
340+
let token10 = lexer.next_token();
341+
assert_eq!(token10.kind, Tokenkind::Bang);
342+
assert_eq!(token10.literal, "!");
343+
let token11 = lexer.next_token();
344+
assert_eq!(token11.kind, Tokenkind::Assign);
345+
assert_eq!(token11.literal, "=");
346+
let token12 = lexer.next_token();
347+
assert_eq!(token12.kind, Tokenkind::Eq);
348+
assert_eq!(token12.literal, "==");
349+
let token13 = lexer.next_token();
350+
assert_eq!(token13.kind, Tokenkind::NotEq);
351+
assert_eq!(token13.literal, "!=");
352+
let token14 = lexer.next_token();
353+
assert_eq!(token14.kind, Tokenkind::Gthanoreq);
354+
assert_eq!(token14.literal, ">=");
355+
let token15 = lexer.next_token();
356+
assert_eq!(token15.kind, Tokenkind::Lthanoreq);
357+
assert_eq!(token15.literal, "<=");
358+
}
218359
}

src/lexericals/tokenizer.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ pub enum Tokenkind {
4949
NotEq,
5050
Lthan,
5151
Gthan,
52+
Gthanoreq,
53+
Lthanoreq,
5254
OR,
5355
And,
5456
Bang,
@@ -99,6 +101,8 @@ impl Display for Tokenkind {
99101
Tokenkind::NotEq => write!(f, "NotEq"),
100102
Tokenkind::Lthan => write!(f, "Lthan"),
101103
Tokenkind::Gthan => write!(f, "Gthan"),
104+
Tokenkind::Gthanoreq => write!(f, "Gthanoreq"),
105+
Tokenkind::Lthanoreq => write!(f, "Lthanoreq"),
102106
Tokenkind::OR => write!(f, "OR"),
103107
Tokenkind::And => write!(f, "And"),
104108
Tokenkind::Bang => write!(f, "Bang"),

0 commit comments

Comments
 (0)