Skip to content

Commit 1020ea2

Browse files
salmanmkcvil02
andauthored
Introduce error types (#709)
* typing errors, extra tests * linting --------- Co-authored-by: Piotr Idzik <[email protected]>
1 parent 260b448 commit 1020ea2

File tree

3 files changed

+75
-14
lines changed

3 files changed

+75
-14
lines changed

src/data_structures/postfix_evaluation.rs

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
pub fn evaluate_postfix(expression: &str) -> Result<i32, &'static str> {
1+
#[derive(Debug, PartialEq)]
2+
pub enum PostfixError {
3+
DivisionByZero,
4+
InvalidOperator,
5+
InsufficientOperands,
6+
InvalidExpression,
7+
}
8+
9+
pub fn evaluate_postfix(expression: &str) -> Result<i32, PostfixError> {
210
let mut stack: Vec<i32> = Vec::new();
311

412
for token in expression.split_whitespace() {
@@ -15,23 +23,22 @@ pub fn evaluate_postfix(expression: &str) -> Result<i32, &'static str> {
1523
"*" => stack.push(a * b),
1624
"/" => {
1725
if b == 0 {
18-
return Err("Division by zero");
26+
return Err(PostfixError::DivisionByZero);
1927
}
2028
stack.push(a / b);
2129
}
22-
_ => return Err("Invalid operator"),
30+
_ => return Err(PostfixError::InvalidOperator),
2331
}
2432
} else {
25-
return Err("Insufficient operands");
33+
return Err(PostfixError::InsufficientOperands);
2634
}
2735
}
2836
}
29-
3037
// The final result should be the only element on the stack.
3138
if stack.len() == 1 {
3239
Ok(stack[0])
3340
} else {
34-
Err("Invalid expression")
41+
Err(PostfixError::InvalidExpression)
3542
}
3643
}
3744

@@ -48,11 +55,34 @@ mod tests {
4855

4956
#[test]
5057
fn test_insufficient_operands() {
51-
assert_eq!(evaluate_postfix("+"), Err("Insufficient operands"));
58+
assert_eq!(
59+
evaluate_postfix("+"),
60+
Err(PostfixError::InsufficientOperands)
61+
);
5262
}
5363

5464
#[test]
5565
fn test_division_by_zero() {
56-
assert_eq!(evaluate_postfix("5 0 /"), Err("Division by zero"));
66+
assert_eq!(evaluate_postfix("5 0 /"), Err(PostfixError::DivisionByZero));
67+
}
68+
69+
#[test]
70+
fn test_invalid_operator() {
71+
assert_eq!(
72+
evaluate_postfix("2 3 #"),
73+
Err(PostfixError::InvalidOperator)
74+
);
75+
}
76+
77+
#[test]
78+
fn test_invalid_expression() {
79+
assert_eq!(
80+
evaluate_postfix("2 3"),
81+
Err(PostfixError::InvalidExpression)
82+
);
83+
assert_eq!(
84+
evaluate_postfix("2 3 4 +"),
85+
Err(PostfixError::InvalidExpression)
86+
);
5787
}
5888
}

src/data_structures/queue.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ mod tests {
4747
fn test_enqueue() {
4848
let mut queue: Queue<u8> = Queue::new();
4949
queue.enqueue(64);
50-
assert!(!queue.is_empty());
50+
assert!(!queue.is_empty(), "Queue should not be empty after enqueue");
5151
}
5252

5353
#[test]
@@ -56,7 +56,11 @@ mod tests {
5656
queue.enqueue(32);
5757
queue.enqueue(64);
5858
let retrieved_dequeue = queue.dequeue();
59-
assert_eq!(retrieved_dequeue, Some(32));
59+
assert_eq!(
60+
retrieved_dequeue,
61+
Some(32),
62+
"Dequeue should return the first element"
63+
);
6064
}
6165

6266
#[test]
@@ -65,14 +69,30 @@ mod tests {
6569
queue.enqueue(8);
6670
queue.enqueue(16);
6771
let retrieved_peek = queue.peek_front();
68-
assert_eq!(retrieved_peek, Some(&8));
72+
assert_eq!(
73+
retrieved_peek,
74+
Some(&8),
75+
"Peek should return a reference to the first element"
76+
);
6977
}
7078

7179
#[test]
7280
fn test_size() {
7381
let mut queue: Queue<u8> = Queue::new();
7482
queue.enqueue(8);
7583
queue.enqueue(16);
76-
assert_eq!(2, queue.len());
84+
assert_eq!(
85+
2,
86+
queue.len(),
87+
"Queue length should be equal to the number of enqueued elements"
88+
);
89+
}
90+
91+
#[test]
92+
fn test_is_empty() {
93+
let mut queue: Queue<u8> = Queue::new();
94+
assert!(queue.is_empty(), "Newly created queue should be empty");
95+
queue.enqueue(8);
96+
assert!(!queue.is_empty(), "Queue should not be empty after enqueue");
7797
}
7898
}

src/data_structures/range_minimum_query.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,17 @@
1010
*/
1111

1212
use std::cmp::PartialOrd;
13+
use std::fmt;
14+
15+
/// Custom error for invalid range
16+
#[derive(Debug, PartialEq)]
17+
pub struct RangeError;
18+
19+
impl fmt::Display for RangeError {
20+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
21+
write!(f, "Invalid range")
22+
}
23+
}
1324

1425
pub struct RangeMinimumQuery<T: PartialOrd + Copy> {
1526
// the current version makes a copy of the input array, but this could be changed
@@ -26,9 +37,9 @@ impl<T: PartialOrd + Copy> RangeMinimumQuery<T> {
2637
}
2738
}
2839

29-
pub fn get_range_min(&self, start: usize, end: usize) -> Result<T, &str> {
40+
pub fn get_range_min(&self, start: usize, end: usize) -> Result<T, RangeError> {
3041
if start >= end || start >= self.array.len() || end > self.array.len() {
31-
return Err("invalid range");
42+
return Err(RangeError);
3243
}
3344
let loglen = (end - start).ilog2() as usize;
3445
let idx: usize = end - (1 << loglen);

0 commit comments

Comments
 (0)