Skip to content
Snippets Groups Projects
Commit 0e36fb0b authored by Alexander Schultheiß's avatar Alexander Schultheiß Committed by Julian Komaromy
Browse files

improve tests and readme

parent 7ca8cb25
Branches
No related merge requests found
......@@ -5,4 +5,4 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
\ No newline at end of file
[dependencies]
# Übungsblatt 1
## Generelles
Die ersten beiden Aufgaben dienen zur Vertiefung Ihrer praktischen Erfahrungen in Rust. Sie implementieren einen Stack und eine Baumstruktur.
## Allgemeine Hinweise
Für diese und alle folgenden Praktikumsaufgaben gilt, dass Einsendungen, die in der jeweils mitgegebenen Testumgebung nicht laufen, mit null Punkten bewertet werden! Das beinhaltet insbesondere alle Programme, die sich nicht fehlerfrei kompilieren lassen. Da Cargo für die Ausführung verantwortlich ist, sollte das Projekt bei Ihnen am Ende mit `cargo test` ohne Fehler und Warnungen durchlaufen.
Für diese und alle folgenden Praktikumsaufgaben gilt, dass Einsendungen, die in der jeweils mitgegebenen Testumgebung nicht laufen, entsprechend Punktabzug erhalten! Das beinhaltet insbesondere alle Programme, die sich nicht fehlerfrei kompilieren lassen. Da Cargo für die Ausführung verantwortlich ist, sollte das Projekt bei Ihnen am Ende mit `cargo test` ohne Fehler und Warnungen durchlaufen.
## Abgabemodus
Die Lösung ist in einem eigenen Git-Repository abzugeben.
Sie können in ihrer Lösung jedoch beliebige Hilfstypen und Module selbst definieren.
Die grundlegende Struktur des hier mitgegebenen Templates sollte jedoch nicht verändert werden.
Insbesondere ist es wichtig, dass die öffentliche Schnittstelle der Library, welche über die Signaturen der Methoden und Funktionen und deren absoluten Pfad definiert wird.
Die Lösung ist in einem eigenen Git-Repository abzugeben.
Sie können in ihrer Lösung jedoch beliebige Hilfstypen und Module selbst definieren.
Die grundlegende Struktur des hier mitgegebenen Templates sollte jedoch nicht verändert werden.
Insbesondere ist es wichtig, dass die öffentliche Schnittstelle der Library, welche über die Signaturen der Methoden und Funktionen und deren absoluten Pfad definiert wird, nicht verändert wird.
Zur Lösung der Aufgaben steht für Sie dieses Repository mit
- vorgegebenen Modulen [stack](src/stack.rs) und [syntax_tree](src/syntax_tree.rs)
- der vorgegebenen Schnittstelle der Library in [lib](src/lib.rs)
- eine Reihe von Testfällen (Unit-Tests) innerhalb der Module
- einer Reihe von Testfällen (Unit-Tests) innerhalb der Module
zur Verfügung.
> Sie können die Implementierung mit `cargo test` prüfen. Mit `cargo test -- --nocapture` werden Konsolenausgaben auch bei korrekten Tests angezeigt.
......@@ -107,4 +108,4 @@ impl<T> SyntaxTree<T> {
}
```
- Die zu implementierende Datenstruktur SyntaxTree soll Baumknoten in beliebig komplexen Konfigurationen speichern können und davon beliebig viele.
- Vervollständigen Sie die Implementierung in der Datei [syntax_tree](src/syntax_tree.rs).
\ No newline at end of file
- Vervollständigen Sie die Implementierung in der Datei [syntax_tree](src/syntax_tree.rs).
......@@ -79,17 +79,19 @@ mod tests {
use crate::stack::ListStack;
use crate::Stack;
use std::fmt::Debug;
use std::thread::sleep;
use std::time::{Duration, Instant};
#[test]
fn fill_and_clear() {
println! {"Testing ListStack"}
fill_and_clear_impl(ListStack::init());
fn vec_fill_and_clear() {
println! {"Testing Vec<T>"}
fill_and_clear_impl(Vec::init());
}
#[test]
fn linked_fill_and_clear() {
println! {"Testing ListStack"}
fill_and_clear_impl(ListStack::init());
}
fn fill_and_clear_impl<T: Stack + Debug>(mut stack: T) {
stack.push_val(1);
assert_eq!(stack.top_val(), Some(&1));
......@@ -109,56 +111,4 @@ mod tests {
assert!(stack.is_empty())
}
const BENCHMARK_SIZE: i32 = 10_000_000;
#[test]
fn benchmark() {
let (pushed, popped) = bench(ListStack::init());
println!(
"Own implementation took {}ms for push and {} for pop.",
pushed, popped
);
let (pushed, popped) = bench(Vec::init());
println!(
"Vec wrapper took {}ms for push and {} for pop.",
pushed, popped
);
}
fn bench<T: Stack>(mut stack: T) -> (u128, u128) {
let start = Instant::now();
for i in 1..BENCHMARK_SIZE {
stack.push_val(i);
}
println!("Pushed all elements");
let pushed = start.elapsed().as_millis();
let start = Instant::now();
while stack.pop_val().is_some() {}
println!("Popped all elements");
let popped = start.elapsed().as_millis();
(pushed, popped)
}
#[test]
fn test_mem() {
let stack = ListStack::init();
mem_test(stack);
println!("Finished memory test for ListStack");
println!("Sleeping for 10 seconds.");
sleep(Duration::from_secs(10));
let stack = Vec::init();
mem_test(stack);
println!("Finished memory test for Vec<T>");
}
fn mem_test<T: Stack>(mut stack: T) {
for i in 1..BENCHMARK_SIZE {
stack.push_val(i);
stack.pop_val();
}
println!("Completed memory test elements");
}
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment