Compare commits
6 Commits
5bb9333ae9
...
ab39f443dc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab39f443dc | ||
|
|
a9ba34c59a | ||
|
|
d9193d4b41 | ||
|
|
6c217f7b66 | ||
|
|
0bce2485ab | ||
|
|
b54b0b7023 |
@@ -108,5 +108,3 @@ application, you can run benchmarks to decide if it's something you can afford.
|
|||||||
|
|
||||||
- Check out ["Myths and legends about integer overflow in Rust"](https://huonw.github.io/blog/2016/04/myths-and-legends-about-integer-overflow-in-rust/)
|
- Check out ["Myths and legends about integer overflow in Rust"](https://huonw.github.io/blog/2016/04/myths-and-legends-about-integer-overflow-in-rust/)
|
||||||
for an in-depth discussion about integer overflow in Rust.
|
for an in-depth discussion about integer overflow in Rust.
|
||||||
|
|
||||||
[^catching]: You can try to catch a panic, but it should be a last resort reserved for very specific circumstances.
|
|
||||||
@@ -82,7 +82,7 @@ s.push_str("Hey");
|
|||||||
+---------+--------+----------+
|
+---------+--------+----------+
|
||||||
Stack | pointer | length | capacity |
|
Stack | pointer | length | capacity |
|
||||||
| | | 3 | 5 |
|
| | | 3 | 5 |
|
||||||
+----|----+--------+----------+
|
+--| ----+--------+----------+
|
||||||
|
|
|
|
||||||
|
|
|
|
||||||
v
|
v
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ you'll get something like this in memory:
|
|||||||
+----v----+--------+----------+ +----|----+
|
+----v----+--------+----------+ +----|----+
|
||||||
Stack | pointer | length | capacity | | pointer |
|
Stack | pointer | length | capacity | | pointer |
|
||||||
| | | 3 | 5 | | |
|
| | | 3 | 5 | | |
|
||||||
+----|----+--------+----------+ +---------+
|
+--| ----+--------+----------+ +---------+
|
||||||
| s r
|
| s r
|
||||||
|
|
|
|
||||||
v
|
v
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ pub trait PartialEq {
|
|||||||
```
|
```
|
||||||
|
|
||||||
When you write `x == y` the compiler will look for an implementation of the `PartialEq` trait for the types of `x` and `y`
|
When you write `x == y` the compiler will look for an implementation of the `PartialEq` trait for the types of `x` and `y`
|
||||||
and replace `x == y` with `x.eq(y)`. It's syntax sugar!
|
and replace `x == y` with `x.eq(y)`. It's syntactic sugar!
|
||||||
|
|
||||||
This is the correspondence for the main operators:
|
This is the correspondence for the main operators:
|
||||||
|
|
||||||
|
|||||||
@@ -100,3 +100,8 @@ The compiler will nudge you to derive traits when possible.
|
|||||||
## References
|
## References
|
||||||
|
|
||||||
- The exercise for this section is located in `exercises/04_traits/04_derive`
|
- The exercise for this section is located in `exercises/04_traits/04_derive`
|
||||||
|
|
||||||
|
## Further reading
|
||||||
|
|
||||||
|
- [The little book of Rust macros](https://veykril.github.io/tlborm/)
|
||||||
|
- [Proc macro workshop](https://github.com/dtolnay/proc-macro-workshop)
|
||||||
@@ -9,13 +9,13 @@ impl Ticket {
|
|||||||
panic!("Title cannot be empty");
|
panic!("Title cannot be empty");
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
panic!("Title cannot be longer than 50 characters");
|
panic!("Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
panic!("Description cannot be empty");
|
panic!("Description cannot be empty");
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
panic!("Description cannot be longer than 500 characters");
|
panic!("Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ticket {
|
Ticket {
|
||||||
|
|||||||
@@ -44,13 +44,13 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Title cannot be longer than 50 characters")]
|
#[should_panic(expected = "Title cannot be longer than 50 bytes")]
|
||||||
fn title_cannot_be_longer_than_fifty_chars() {
|
fn title_cannot_be_longer_than_fifty_chars() {
|
||||||
Ticket::new(overly_long_title(), valid_description(), "To-Do".into());
|
Ticket::new(overly_long_title(), valid_description(), "To-Do".into());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Description cannot be longer than 500 characters")]
|
#[should_panic(expected = "Description cannot be longer than 500 bytes")]
|
||||||
fn description_cannot_be_longer_than_500_chars() {
|
fn description_cannot_be_longer_than_500_chars() {
|
||||||
Ticket::new(valid_title(), overly_long_description(), "To-Do".into());
|
Ticket::new(valid_title(), overly_long_description(), "To-Do".into());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,13 +19,13 @@ impl Ticket {
|
|||||||
panic!("Title cannot be empty");
|
panic!("Title cannot be empty");
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
panic!("Title cannot be longer than 50 characters");
|
panic!("Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
panic!("Description cannot be empty");
|
panic!("Description cannot be empty");
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
panic!("Description cannot be longer than 500 characters");
|
panic!("Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
||||||
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
||||||
|
|||||||
@@ -11,13 +11,13 @@ mod ticket {
|
|||||||
panic!("Title cannot be empty");
|
panic!("Title cannot be empty");
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
panic!("Title cannot be longer than 50 characters");
|
panic!("Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
panic!("Description cannot be empty");
|
panic!("Description cannot be empty");
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
panic!("Description cannot be longer than 500 characters");
|
panic!("Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
||||||
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
||||||
|
|||||||
@@ -11,13 +11,13 @@ pub mod ticket {
|
|||||||
panic!("Title cannot be empty");
|
panic!("Title cannot be empty");
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
panic!("Title cannot be longer than 50 characters");
|
panic!("Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
panic!("Description cannot be empty");
|
panic!("Description cannot be empty");
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
panic!("Description cannot be longer than 500 characters");
|
panic!("Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
||||||
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
||||||
|
|||||||
@@ -15,13 +15,13 @@ impl Ticket {
|
|||||||
panic!("Title cannot be empty");
|
panic!("Title cannot be empty");
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
panic!("Title cannot be longer than 50 characters");
|
panic!("Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
panic!("Description cannot be empty");
|
panic!("Description cannot be empty");
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
panic!("Description cannot be longer than 500 characters");
|
panic!("Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
||||||
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
||||||
|
|||||||
@@ -14,13 +14,13 @@ impl Ticket {
|
|||||||
panic!("Title cannot be empty");
|
panic!("Title cannot be empty");
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
panic!("Title cannot be longer than 50 characters");
|
panic!("Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
panic!("Description cannot be empty");
|
panic!("Description cannot be empty");
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
panic!("Description cannot be longer than 500 characters");
|
panic!("Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
||||||
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
||||||
@@ -76,14 +76,14 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Title cannot be longer than 50 characters")]
|
#[should_panic(expected = "Title cannot be longer than 50 bytes")]
|
||||||
fn title_cannot_be_longer_than_fifty_chars() {
|
fn title_cannot_be_longer_than_fifty_chars() {
|
||||||
Ticket::new(valid_title(), valid_description(), "To-Do".into())
|
Ticket::new(valid_title(), valid_description(), "To-Do".into())
|
||||||
.set_title(overly_long_title())
|
.set_title(overly_long_title())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Description cannot be longer than 500 characters")]
|
#[should_panic(expected = "Description cannot be longer than 500 bytes")]
|
||||||
fn description_cannot_be_longer_than_500_chars() {
|
fn description_cannot_be_longer_than_500_chars() {
|
||||||
Ticket::new(valid_title(), valid_description(), "To-Do".into())
|
Ticket::new(valid_title(), valid_description(), "To-Do".into())
|
||||||
.set_description(overly_long_description())
|
.set_description(overly_long_description())
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn u64_mut_ref_size() {
|
fn u64_mut_ref_size() {
|
||||||
assert_eq!(size_of::<&u64>(), todo!());
|
assert_eq!(size_of::<&mut u64>(), todo!());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// TODO: Define a new `Order` type.
|
// TODO: Define a new `Order` type.
|
||||||
// It should keep track of three pieces of information: `product_name`, `quantity`, and `unit_price`.
|
// It should keep track of three pieces of information: `product_name`, `quantity`, and `unit_price`.
|
||||||
// The product name can't be empty and it can't be longer than 300 characters.
|
// The product name can't be empty and it can't be longer than 300 bytes.
|
||||||
// The quantity must be strictly greater than zero.
|
// The quantity must be strictly greater than zero.
|
||||||
// The unit price is in cents and must be strictly greater than zero.
|
// The unit price is in cents and must be strictly greater than zero.
|
||||||
// Order must include a method named `total` that returns the total price of the order.
|
// Order must include a method named `total` that returns the total price of the order.
|
||||||
|
|||||||
@@ -12,13 +12,13 @@ impl Ticket {
|
|||||||
panic!("Title cannot be empty");
|
panic!("Title cannot be empty");
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
panic!("Title cannot be longer than 50 characters");
|
panic!("Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
panic!("Description cannot be empty");
|
panic!("Description cannot be empty");
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
panic!("Description cannot be longer than 500 characters");
|
panic!("Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
||||||
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ impl Ticket {
|
|||||||
panic!("Title cannot be empty");
|
panic!("Title cannot be empty");
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
panic!("Title cannot be longer than 50 characters");
|
panic!("Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
panic!("Description cannot be empty");
|
panic!("Description cannot be empty");
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
panic!("Description cannot be longer than 500 characters");
|
panic!("Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
if status != "To-Do" && status != "In Progress" && status != "Done" {
|
||||||
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
|
||||||
|
|||||||
@@ -22,13 +22,13 @@ impl Ticket {
|
|||||||
panic!("Title cannot be empty");
|
panic!("Title cannot be empty");
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
panic!("Title cannot be longer than 50 characters");
|
panic!("Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
panic!("Description cannot be empty");
|
panic!("Description cannot be empty");
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
panic!("Description cannot be longer than 500 characters");
|
panic!("Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ticket {
|
Ticket {
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ impl Ticket {
|
|||||||
panic!("Title cannot be empty");
|
panic!("Title cannot be empty");
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
panic!("Title cannot be longer than 50 characters");
|
panic!("Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
panic!("Description cannot be empty");
|
panic!("Description cannot be empty");
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
panic!("Description cannot be longer than 500 characters");
|
panic!("Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ticket {
|
Ticket {
|
||||||
|
|||||||
@@ -21,13 +21,13 @@ impl Ticket {
|
|||||||
panic!("Title cannot be empty");
|
panic!("Title cannot be empty");
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
panic!("Title cannot be longer than 50 characters");
|
panic!("Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
panic!("Description cannot be empty");
|
panic!("Description cannot be empty");
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
panic!("Description cannot be longer than 500 characters");
|
panic!("Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ticket {
|
Ticket {
|
||||||
@@ -59,13 +59,13 @@ mod tests {
|
|||||||
fn title_cannot_be_longer_than_fifty_chars() {
|
fn title_cannot_be_longer_than_fifty_chars() {
|
||||||
let error =
|
let error =
|
||||||
Ticket::new(overly_long_title(), valid_description(), Status::ToDo).unwrap_err();
|
Ticket::new(overly_long_title(), valid_description(), Status::ToDo).unwrap_err();
|
||||||
assert_eq!(error, "Title cannot be longer than 50 characters");
|
assert_eq!(error, "Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn description_cannot_be_longer_than_500_chars() {
|
fn description_cannot_be_longer_than_500_chars() {
|
||||||
let error =
|
let error =
|
||||||
Ticket::new(valid_title(), overly_long_description(), Status::ToDo).unwrap_err();
|
Ticket::new(valid_title(), overly_long_description(), Status::ToDo).unwrap_err();
|
||||||
assert_eq!(error, "Description cannot be longer than 500 characters");
|
assert_eq!(error, "Description cannot be longer than 500 bytes");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ impl Ticket {
|
|||||||
return Err("Title cannot be empty".to_string());
|
return Err("Title cannot be empty".to_string());
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
return Err("Title cannot be longer than 50 characters".to_string());
|
return Err("Title cannot be longer than 50 bytes".to_string());
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
return Err("Description cannot be empty".to_string());
|
return Err("Description cannot be empty".to_string());
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
return Err("Description cannot be longer than 500 characters".to_string());
|
return Err("Description cannot be longer than 500 bytes".to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Ticket {
|
Ok(Ticket {
|
||||||
@@ -60,7 +60,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Title cannot be longer than 50 characters")]
|
#[should_panic(expected = "Title cannot be longer than 50 bytes")]
|
||||||
fn title_cannot_be_longer_than_fifty_chars() {
|
fn title_cannot_be_longer_than_fifty_chars() {
|
||||||
easy_ticket(overly_long_title(), valid_description(), Status::ToDo);
|
easy_ticket(overly_long_title(), valid_description(), Status::ToDo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,13 +35,13 @@ impl Ticket {
|
|||||||
return Err("Title cannot be empty".to_string());
|
return Err("Title cannot be empty".to_string());
|
||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
return Err("Title cannot be longer than 50 characters".to_string());
|
return Err("Title cannot be longer than 50 bytes".to_string());
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
return Err("Description cannot be empty".to_string());
|
return Err("Description cannot be empty".to_string());
|
||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
return Err("Description cannot be longer than 500 characters".to_string());
|
return Err("Description cannot be longer than 500 bytes".to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Ticket {
|
Ok(Ticket {
|
||||||
@@ -70,7 +70,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Title cannot be longer than 50 characters")]
|
#[should_panic(expected = "Title cannot be longer than 50 bytes")]
|
||||||
fn title_cannot_be_longer_than_fifty_chars() {
|
fn title_cannot_be_longer_than_fifty_chars() {
|
||||||
easy_ticket(overly_long_title(), valid_description(), Status::ToDo);
|
easy_ticket(overly_long_title(), valid_description(), Status::ToDo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ impl Ticket {
|
|||||||
}
|
}
|
||||||
if title.len() > 50 {
|
if title.len() > 50 {
|
||||||
return Err(TicketNewError::TitleError(
|
return Err(TicketNewError::TitleError(
|
||||||
"Title cannot be longer than 50 characters".to_string(),
|
"Title cannot be longer than 50 bytes".to_string(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
if description.is_empty() {
|
if description.is_empty() {
|
||||||
@@ -53,7 +53,7 @@ impl Ticket {
|
|||||||
}
|
}
|
||||||
if description.len() > 500 {
|
if description.len() > 500 {
|
||||||
return Err(TicketNewError::DescriptionError(
|
return Err(TicketNewError::DescriptionError(
|
||||||
"Description cannot be longer than 500 characters".to_string(),
|
"Description cannot be longer than 500 bytes".to_string(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Title cannot be longer than 50 characters")]
|
#[should_panic(expected = "Title cannot be longer than 50 bytes")]
|
||||||
fn title_cannot_be_longer_than_fifty_chars() {
|
fn title_cannot_be_longer_than_fifty_chars() {
|
||||||
easy_ticket(overly_long_title(), valid_description(), Status::ToDo);
|
easy_ticket(overly_long_title(), valid_description(), Status::ToDo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn title_cannot_be_longer_than_fifty_chars() {
|
fn title_cannot_be_longer_than_fifty_chars() {
|
||||||
let err = Ticket::new(overly_long_title(), valid_description(), Status::ToDo).unwrap_err();
|
let err = Ticket::new(overly_long_title(), valid_description(), Status::ToDo).unwrap_err();
|
||||||
assert_eq!(err.to_string(), "Title cannot be longer than 50 characters");
|
assert_eq!(err.to_string(), "Title cannot be longer than 50 bytes");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -79,7 +79,7 @@ mod tests {
|
|||||||
let err = Ticket::new(valid_title(), overly_long_description(), Status::ToDo).unwrap_err();
|
let err = Ticket::new(valid_title(), overly_long_description(), Status::ToDo).unwrap_err();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
err.to_string(),
|
err.to_string(),
|
||||||
"Description cannot be longer than 500 characters"
|
"Description cannot be longer than 500 bytes"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ mod status;
|
|||||||
pub enum TicketNewError {
|
pub enum TicketNewError {
|
||||||
#[error("Title cannot be empty")]
|
#[error("Title cannot be empty")]
|
||||||
TitleCannotBeEmpty,
|
TitleCannotBeEmpty,
|
||||||
#[error("Title cannot be longer than 50 characters")]
|
#[error("Title cannot be longer than 50 bytes")]
|
||||||
TitleTooLong,
|
TitleTooLong,
|
||||||
#[error("Description cannot be empty")]
|
#[error("Description cannot be empty")]
|
||||||
DescriptionCannotBeEmpty,
|
DescriptionCannotBeEmpty,
|
||||||
#[error("Description cannot be longer than 500 characters")]
|
#[error("Description cannot be longer than 500 bytes")]
|
||||||
DescriptionTooLong,
|
DescriptionTooLong,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// TODO: Implement `TryFrom<String>` and `TryFrom<&str>` for the `TicketDescription` type,
|
// TODO: Implement `TryFrom<String>` and `TryFrom<&str>` for the `TicketDescription` type,
|
||||||
// enforcing that the description is not empty and is not longer than 500 characters.
|
// enforcing that the description is not empty and is not longer than 500 bytes.
|
||||||
// Implement the traits required to make the tests pass too.
|
// Implement the traits required to make the tests pass too.
|
||||||
|
|
||||||
pub struct TicketDescription(String);
|
pub struct TicketDescription(String);
|
||||||
@@ -27,7 +27,7 @@ mod tests {
|
|||||||
let err = TicketDescription::try_from(description).unwrap_err();
|
let err = TicketDescription::try_from(description).unwrap_err();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
err.to_string(),
|
err.to_string(),
|
||||||
"The description cannot be longer than 500 characters"
|
"The description cannot be longer than 500 bytes"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,10 +27,7 @@ mod tests {
|
|||||||
"A title that's definitely longer than what should be allowed in a development ticket"
|
"A title that's definitely longer than what should be allowed in a development ticket"
|
||||||
.to_string();
|
.to_string();
|
||||||
let err = TicketTitle::try_from(title).unwrap_err();
|
let err = TicketTitle::try_from(title).unwrap_err();
|
||||||
assert_eq!(
|
assert_eq!(err.to_string(), "The title cannot be longer than 50 bytes");
|
||||||
err.to_string(),
|
|
||||||
"The title cannot be longer than 50 characters"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ pub struct TicketDescription(String);
|
|||||||
pub enum TicketDescriptionError {
|
pub enum TicketDescriptionError {
|
||||||
#[error("The description cannot be empty")]
|
#[error("The description cannot be empty")]
|
||||||
Empty,
|
Empty,
|
||||||
#[error("The description cannot be longer than 500 characters")]
|
#[error("The description cannot be longer than 500 bytes")]
|
||||||
TooLong,
|
TooLong,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ mod tests {
|
|||||||
let err = TicketDescription::try_from(overly_long_description()).unwrap_err();
|
let err = TicketDescription::try_from(overly_long_description()).unwrap_err();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
err.to_string(),
|
err.to_string(),
|
||||||
"The description cannot be longer than 500 characters"
|
"The description cannot be longer than 500 bytes"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ pub struct TicketTitle(String);
|
|||||||
pub enum TicketTitleError {
|
pub enum TicketTitleError {
|
||||||
#[error("The title cannot be empty")]
|
#[error("The title cannot be empty")]
|
||||||
Empty,
|
Empty,
|
||||||
#[error("The title cannot be longer than 50 characters")]
|
#[error("The title cannot be longer than 50 bytes")]
|
||||||
TooLong,
|
TooLong,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,10 +61,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_try_from_long_string() {
|
fn test_try_from_long_string() {
|
||||||
let err = TicketTitle::try_from(overly_long_title()).unwrap_err();
|
let err = TicketTitle::try_from(overly_long_title()).unwrap_err();
|
||||||
assert_eq!(
|
assert_eq!(err.to_string(), "The title cannot be longer than 50 bytes");
|
||||||
err.to_string(),
|
|
||||||
"The title cannot be longer than 50 characters"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user