mirror of
https://github.com/FliegendeWurst/cursive.git
synced 2024-11-23 17:35:00 +00:00
Add skeptic tests
This commit is contained in:
parent
7e9609826c
commit
51e955808c
@ -9,6 +9,7 @@ name = "cursive"
|
|||||||
readme = "Readme.md"
|
readme = "Readme.md"
|
||||||
repository = "https://github.com/gyscos/Cursive"
|
repository = "https://github.com/gyscos/Cursive"
|
||||||
version = "0.2.6"
|
version = "0.2.6"
|
||||||
|
build="build.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
odds = "0.2"
|
odds = "0.2"
|
||||||
@ -22,6 +23,10 @@ version = "5.82.0"
|
|||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
rand = "0.3"
|
rand = "0.3"
|
||||||
|
skeptic = "0.5"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
skeptic = "0.5"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "cursive"
|
name = "cursive"
|
||||||
|
@ -26,7 +26,7 @@ cursive = { git = "https://github.com/gyscos/Cursive" }
|
|||||||
|
|
||||||
(You will also need ncurses installed - if it isn't already, check in your package manager. Make sure you install the `ncursesw` version if available, for UTF-8 support.)
|
(You will also need ncurses installed - if it isn't already, check in your package manager. Make sure you install the `ncursesw` version if available, for UTF-8 support.)
|
||||||
|
|
||||||
```rust
|
```rust,no_run
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
|
|
||||||
use cursive::prelude::*;
|
use cursive::prelude::*;
|
||||||
|
8
build.rs
Normal file
8
build.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
extern crate skeptic;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
skeptic::generate_doc_tests(&["Readme.md",
|
||||||
|
"doc/tutorial_1.md",
|
||||||
|
"doc/tutorial_2.md",
|
||||||
|
"doc/tutorial_3.md" ]);
|
||||||
|
}
|
@ -5,7 +5,7 @@
|
|||||||
In this first tutorial, we'll learn the basics of cursive,
|
In this first tutorial, we'll learn the basics of cursive,
|
||||||
and write a very basic first application:
|
and write a very basic first application:
|
||||||
|
|
||||||
```rust
|
```rust,no_run
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
|
|
||||||
use cursive::Cursive;
|
use cursive::Cursive;
|
||||||
@ -50,7 +50,7 @@ cursive = "*"
|
|||||||
|
|
||||||
Finally, update `src/main.rs` to import it:
|
Finally, update `src/main.rs` to import it:
|
||||||
|
|
||||||
```rust
|
```rust,no_run
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
@ -74,7 +74,7 @@ so let's skip it for now.
|
|||||||
|
|
||||||
In its simplest form, a cursive application is therefore:
|
In its simplest form, a cursive application is therefore:
|
||||||
|
|
||||||
```rust
|
```rust,no_run
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
|
|
||||||
use cursive::Cursive;
|
use cursive::Cursive;
|
||||||
@ -111,7 +111,7 @@ This method takes 2 arguments: a trigger, and a callback.
|
|||||||
|
|
||||||
In the end, we have:
|
In the end, we have:
|
||||||
|
|
||||||
```rust
|
```rust,no_run
|
||||||
# src/main.rs
|
# src/main.rs
|
||||||
|
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
@ -154,7 +154,7 @@ exactly that.
|
|||||||
|
|
||||||
Once we've added this line, our first application is complete:
|
Once we've added this line, our first application is complete:
|
||||||
|
|
||||||
```rust
|
```rust,no_run
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
|
|
||||||
use cursive::Cursive;
|
use cursive::Cursive;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
This time, we'll work on a slightly bigger example, where the user will need to
|
This time, we'll work on a slightly bigger example, where the user will need to
|
||||||
actually make some choices. Here is what the code will look like:
|
actually make some choices. Here is what the code will look like:
|
||||||
|
|
||||||
```rust
|
```rust,no_run
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
|
|
||||||
use cursive::Cursive;
|
use cursive::Cursive;
|
||||||
@ -45,8 +45,8 @@ fn show_answer(s: &mut Cursive, msg: &str) {
|
|||||||
This time you're not a beginner anymore, so we'll skip the introduction!
|
This time you're not a beginner anymore, so we'll skip the introduction!
|
||||||
Let's start from a basic cursive application:
|
Let's start from a basic cursive application:
|
||||||
|
|
||||||
```rust
|
```rust,no_run
|
||||||
extern crate cursive
|
extern crate cursive;
|
||||||
|
|
||||||
use cursive::Cursive;
|
use cursive::Cursive;
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ and/or buttons.
|
|||||||
[`Dialog::new`] directly takes a view, so we'll directly give it the
|
[`Dialog::new`] directly takes a view, so we'll directly give it the
|
||||||
`TextView`:
|
`TextView`:
|
||||||
|
|
||||||
```rust
|
```rust,no_run
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
|
|
||||||
use cursive::Cursive;
|
use cursive::Cursive;
|
||||||
@ -87,7 +87,7 @@ Since creating a `Dialog` around a `TextView` is a pretty common task,
|
|||||||
becomes a little shorter (and we don't need to import
|
becomes a little shorter (and we don't need to import
|
||||||
`cursive::views::TextView` anymore):
|
`cursive::views::TextView` anymore):
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
siv.add_layer(Dialog::text("..."));
|
siv.add_layer(Dialog::text("..."));
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ Next, let's add a title. To do that, `Dialog` has a chainable [`Dialog::title`]
|
|||||||
method. It takes the dialog by value, and return it back, making function
|
method. It takes the dialog by value, and return it back, making function
|
||||||
chains easy:
|
chains easy:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
siv.add_layer(Dialog::text("...").title("..."));
|
siv.add_layer(Dialog::text("...").title("..."));
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -114,7 +114,7 @@ Just like with the title, `Dialog` has a [`Dialog::button`] method to add a
|
|||||||
button in a chain. This method takes a label and a callback, the same kind
|
button in a chain. This method takes a label and a callback, the same kind
|
||||||
we saw in the previous tutorial:
|
we saw in the previous tutorial:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
siv.add_layer(Dialog::text("...")
|
siv.add_layer(Dialog::text("...")
|
||||||
.title("...")
|
.title("...")
|
||||||
.button("Quit", |s| s.quit()));
|
.button("Quit", |s| s.quit()));
|
||||||
@ -124,7 +124,7 @@ Only this time, we don't want to exit the application right away. Instead of
|
|||||||
packing everything into the closure, let's use a separate function for the
|
packing everything into the closure, let's use a separate function for the
|
||||||
callback. Here is the current state:
|
callback. Here is the current state:
|
||||||
|
|
||||||
```rust
|
```rust,no_run
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
|
|
||||||
use cursive::Cursive;
|
use cursive::Cursive;
|
||||||
@ -152,7 +152,7 @@ and show a new one instead. We'll use [`Cursive::pop_layer`] to do that.
|
|||||||
|
|
||||||
Then, we add a new `Dialog`, this time with a few more buttons:
|
Then, we add a new `Dialog`, this time with a few more buttons:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
fn show_next(s: &mut Cursive) {
|
fn show_next(s: &mut Cursive) {
|
||||||
s.pop_layer();
|
s.pop_layer();
|
||||||
s.add_layer(Dialog::text("Did you do the thing?")
|
s.add_layer(Dialog::text("Did you do the thing?")
|
||||||
@ -169,7 +169,7 @@ The `<Uh?>` button will add a new popup, without removing the current one:
|
|||||||
it'll act as a dismissable infobox. `Dialog::info()` is a shortcut to build
|
it'll act as a dismissable infobox. `Dialog::info()` is a shortcut to build
|
||||||
such a popup:
|
such a popup:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
fn show_next(s: &mut Cursive) {
|
fn show_next(s: &mut Cursive) {
|
||||||
s.pop_layer();
|
s.pop_layer();
|
||||||
s.add_layer(Dialog::text("Did you do the thing?")
|
s.add_layer(Dialog::text("Did you do the thing?")
|
||||||
@ -183,7 +183,7 @@ fn show_next(s: &mut Cursive) {
|
|||||||
Finally, let's have the "Yes" and "No" buttons use the same callback method to
|
Finally, let's have the "Yes" and "No" buttons use the same callback method to
|
||||||
print a message, but with a different text parameter:
|
print a message, but with a different text parameter:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
fn show_next(s: &mut Cursive) {
|
fn show_next(s: &mut Cursive) {
|
||||||
s.pop_layer();
|
s.pop_layer();
|
||||||
s.add_layer(Dialog::text("Did you do the thing?")
|
s.add_layer(Dialog::text("Did you do the thing?")
|
||||||
|
@ -8,7 +8,7 @@ them to update them.
|
|||||||
|
|
||||||
Here is the code we'll end up with:
|
Here is the code we'll end up with:
|
||||||
|
|
||||||
```rust
|
```rust,no_run
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
|
|
||||||
use cursive::prelude::*;
|
use cursive::prelude::*;
|
||||||
@ -81,7 +81,7 @@ The main element in our application will be a list of names. For this, we'll
|
|||||||
use a [`SelectView`]. This type is generic on the item stored. We just want
|
use a [`SelectView`]. This type is generic on the item stored. We just want
|
||||||
to store the names, so let's build a `SelectView<String>`:
|
to store the names, so let's build a `SelectView<String>`:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
let select = SelectView::<String>::new();
|
let select = SelectView::<String>::new();
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ professional-looking, so we'll give it a fixed size.
|
|||||||
To do that, a [`BoxView`] can wrap any view and give it a fixed size.
|
To do that, a [`BoxView`] can wrap any view and give it a fixed size.
|
||||||
We could do:
|
We could do:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
let select = BoxView::with_fixed_size((10, 5), SelectView::<String>::new());
|
let select = BoxView::with_fixed_size((10, 5), SelectView::<String>::new());
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ But there is another shorter way: the [`Boxable`] trait is conveniently
|
|||||||
implemented for any `View`, and allow to wrap in a `BoxView` with a chainable
|
implemented for any `View`, and allow to wrap in a `BoxView` with a chainable
|
||||||
call:
|
call:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
let select = SelectView::<String>::new()
|
let select = SelectView::<String>::new()
|
||||||
.fixed_size((10, 5));
|
.fixed_size((10, 5));
|
||||||
```
|
```
|
||||||
@ -110,7 +110,7 @@ We'll also want to add a callback when the user chooses a name. The
|
|||||||
the selected item. Since we're using `String`, our callback will have to be
|
the selected item. Since we're using `String`, our callback will have to be
|
||||||
`Fn(&mut Cursive, &String)`:
|
`Fn(&mut Cursive, &String)`:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
let select = SelectView::<String>::new()
|
let select = SelectView::<String>::new()
|
||||||
.on_submit(on_submit)
|
.on_submit(on_submit)
|
||||||
.fixed_size((10, 5));
|
.fixed_size((10, 5));
|
||||||
@ -149,7 +149,7 @@ We'll use two of them:
|
|||||||
|
|
||||||
Let's start with the column of buttons:
|
Let's start with the column of buttons:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
let buttons = LinearLayout::vertical()
|
let buttons = LinearLayout::vertical()
|
||||||
.child(Button::new("Add new", add_name))
|
.child(Button::new("Add new", add_name))
|
||||||
.child(Button::new("Delete", delete_name))
|
.child(Button::new("Delete", delete_name))
|
||||||
@ -166,7 +166,7 @@ as a cheap spacer.
|
|||||||
|
|
||||||
We can now create the second linear layout inside a Dialog:
|
We can now create the second linear layout inside a Dialog:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
siv.add_layer(Dialog::new(LinearLayout::horizontal()
|
siv.add_layer(Dialog::new(LinearLayout::horizontal()
|
||||||
.child(select)
|
.child(select)
|
||||||
.child(DummyView)
|
.child(DummyView)
|
||||||
@ -188,7 +188,7 @@ this list with names!
|
|||||||
When the user presses the `<Add new>` button, we want to show a popup where he
|
When the user presses the `<Add new>` button, we want to show a popup where he
|
||||||
can enter a new name:
|
can enter a new name:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
fn add_name(s: &mut Cursive) {
|
fn add_name(s: &mut Cursive) {
|
||||||
s.add_layer(Dialog::new(EditView::new()
|
s.add_layer(Dialog::new(EditView::new()
|
||||||
.fixed_width(10))
|
.fixed_width(10))
|
||||||
@ -222,7 +222,7 @@ reference to the view.
|
|||||||
|
|
||||||
Here's what it looks like in action:
|
Here's what it looks like in action:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
fn add_name(s: &mut Cursive) {
|
fn add_name(s: &mut Cursive) {
|
||||||
s.add_layer(Dialog::new(EditView::new()
|
s.add_layer(Dialog::new(EditView::new()
|
||||||
.with_id("name")
|
.with_id("name")
|
||||||
@ -242,7 +242,7 @@ calling `find_id`.
|
|||||||
Now we just need to do something with this name: add it to the list!
|
Now we just need to do something with this name: add it to the list!
|
||||||
Remember the `SelectView` we created? Let's give it an ID too:
|
Remember the `SelectView` we created? Let's give it an ID too:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
let select = SelectView::<String>::new()
|
let select = SelectView::<String>::new()
|
||||||
.on_submit(on_submit)
|
.on_submit(on_submit)
|
||||||
.with_id("select")
|
.with_id("select")
|
||||||
@ -253,7 +253,7 @@ the `BoxView`. But we still need to call `on_submit` before that.)
|
|||||||
|
|
||||||
That way, we can update it with a new item:
|
That way, we can update it with a new item:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
fn add_name(s: &mut Cursive) {
|
fn add_name(s: &mut Cursive) {
|
||||||
fn ok(s: &mut Cursive, name: &str) {
|
fn ok(s: &mut Cursive, name: &str) {
|
||||||
s.find_id::<SelectView<String>>("select").unwrap().add_item_str(name);
|
s.find_id::<SelectView<String>>("select").unwrap().add_item_str(name);
|
||||||
@ -277,7 +277,7 @@ fn add_name(s: &mut Cursive) {
|
|||||||
Now that we know how to access the `SelectView`, removing an item is not very
|
Now that we know how to access the `SelectView`, removing an item is not very
|
||||||
complicated:
|
complicated:
|
||||||
|
|
||||||
```rust
|
```rust,ignore
|
||||||
fn delete_name(s: &mut Cursive) {
|
fn delete_name(s: &mut Cursive) {
|
||||||
match s.find_id::<SelectView<String>>("select").unwrap().selected_id() {
|
match s.find_id::<SelectView<String>>("select").unwrap().selected_id() {
|
||||||
None => s.add_layer(Dialog::info("No name to remove")),
|
None => s.add_layer(Dialog::info("No name to remove")),
|
||||||
|
1
tests/skeptic.rs
Normal file
1
tests/skeptic.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
include!(concat!(env!("OUT_DIR"), "/skeptic-tests.rs"));
|
Loading…
Reference in New Issue
Block a user