summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Holloway <nyxtom@gmail.com>2019-10-28 22:49:49 -0500
committerThomas Holloway <nyxtom@gmail.com>2019-10-28 22:49:49 -0500
commitdc15032112fc485226a573a18139e5ce928b1755 (patch)
tree9a54577ded6adb2dc67df6b9f6e0980008cf817e
parent2191ef7eee2f0d7bb006d2174ba5bdd4057fd3c4 (diff)
feat: Add enums exercises
-rw-r--r--exercises/enums/README.md7
-rw-r--r--exercises/enums/enums1.rs42
-rw-r--r--exercises/enums/enums2.rs61
-rw-r--r--exercises/enums/enums3.rs63
-rw-r--r--info.toml14
5 files changed, 187 insertions, 0 deletions
diff --git a/exercises/enums/README.md b/exercises/enums/README.md
new file mode 100644
index 0000000..f31a713
--- /dev/null
+++ b/exercises/enums/README.md
@@ -0,0 +1,7 @@
+### Enums
+
+Rust allows you to define a type called `enums` which allow you to enumerate possible values. In combination with enums, we have the concept of `pattern matching` in Rust, which makes it easy to run different code for different values of an enumeration. Enums, while available in many languages, Rust's enums are most similar to `algebraic data types` in functional languages, such as F#, OCaml, and Haskell.
+
+#### Book Sections
+
+- [Enums](https://doc.rust-lang.org/book/ch06-00-enums.html)
diff --git a/exercises/enums/enums1.rs b/exercises/enums/enums1.rs
new file mode 100644
index 0000000..8b14f29
--- /dev/null
+++ b/exercises/enums/enums1.rs
@@ -0,0 +1,42 @@
+// enums1.rs
+// Make me compile! Scroll down for hints!
+
+#[derive(Debug)]
+enum Message {
+ // TODO: define a few types of messages as used below
+}
+
+fn main() {
+ println!("{:?}", Message::Quit);
+ println!("{:?}", Message::Echo);
+ println!("{:?}", Message::Move);
+ println!("{:?}", Message::ChangeColor);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// Hint: The declaration of the enumeration type has not been defined yet.
diff --git a/exercises/enums/enums2.rs b/exercises/enums/enums2.rs
new file mode 100644
index 0000000..71ac839
--- /dev/null
+++ b/exercises/enums/enums2.rs
@@ -0,0 +1,61 @@
+// enums2.rs
+// Make me compile! Scroll down for hints
+
+#[derive(Debug)]
+enum Message {
+ // TODO: define the different variants used below
+}
+
+impl Message {
+ fn call(&self) {
+ println!("{:?}", &self);
+ }
+}
+
+fn main() {
+ let messages = [
+ Message::Move{ x: 10, y: 30 },
+ Message::Echo(String::from("hello world")),
+ Message::ChangeColor(200, 255, 255),
+ Message::Quit
+ ];
+
+ for message in &messages {
+ message.call();
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// Hint: you can create enumerations that have different variants with different types
+// such as no data, anonymous structs, a single string, tuples, ...etc
diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs
new file mode 100644
index 0000000..c5d81bf
--- /dev/null
+++ b/exercises/enums/enums3.rs
@@ -0,0 +1,63 @@
+// enums3.rs
+// Address all the TODOs to make the tests pass!
+
+enum Message {
+ // TODO: implement the message variant types based on their usage below
+}
+
+struct Point {
+ x: u8,
+ y: u8
+}
+
+struct State {
+ color: (u8, u8, u8),
+ position: Point,
+ quit: bool
+}
+
+impl State {
+ fn change_color(&mut self, color: (u8, u8, u8)) {
+ self.color = color;
+ }
+
+ fn quit(&mut self) {
+ self.quit = true;
+ }
+
+ fn echo(&self, s: String) {
+ println!("{}", s);
+ }
+
+ fn move_position(&mut self, p: Point) {
+ self.position = p;
+ }
+
+ fn process(&mut self, message: Message) {
+ // TODO: create a match expression to process the different message variants
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_match_message_call() {
+ let mut state = State{
+ quit: false,
+ position: Point{ x: 0, y: 0 },
+ color: (0, 0, 0)
+ };
+ state.process(Message::ChangeColor(255, 0, 255));
+ state.process(Message::Echo(String::from("hello world")));
+ state.process(Message::Move{ x: 10, y: 15 });
+ state.process(Message::Quit);
+
+ assert_eq!(state.color, (255, 0, 255));
+ assert_eq!(state.position.x, 10);
+ assert_eq!(state.position.y, 15);
+ assert_eq!(state.quit, true);
+ }
+
+}
diff --git a/info.toml b/info.toml
index 5e35334..454d358 100644
--- a/info.toml
+++ b/info.toml
@@ -86,6 +86,20 @@ mode = "test"
path = "exercises/structs/structs2.rs"
mode = "test"
+# ENUMS
+
+[[exercises]]
+path = "exercises/enums/enums1.rs"
+mode = "compile"
+
+[[exercises]]
+path = "exercises/enums/enums2.rs"
+mode = "compile"
+
+[[exercises]]
+path = "exercises/enums/enums3.rs"
+mode = "test"
+
# TESTS
[[exercises]]