🚧 Attention, peinture fraîche !
Cette page a été traduite par une seule personne et n'a pas été relue et vérifiée par quelqu'un d'autre ! Les informations peuvent par exemple être erronées, être formulées maladroitement, ou contenir d'autres types de fautes.
Tester le jeu de la vie de Conway
Maintenant que nous avons notre implémentation en Rust du jeu de la vie qui s'exécute dans le navigateur web avec JavaScript, nous pouvons voir comment tester nos fonctions WebAssembly générées par Rust.
Nous allons tester notre fonction tick
pour s'assurer qu'elle nous donne bien
le résultat que nous souhaitons.
Ensuite, nous allons créer des mutateurs et des accesseurs dans notre bloc
impl Univers
dans le ficher wasm-jeu-de-la-vie/src/lib.rs
. Nous allons créer
une fonction set_largeur
et set_hauteur
pour que nous puissions créer des
Univers
de différentes tailles.
#![allow(unused)] fn main() { #[wasm_bindgen] impl Univers { // ... /// Définit la largeur de l'univers. /// /// Cela va tuer toutes les cellules. pub fn set_largeur(&mut self, largeur: u32) { self.largeur = largeur; self.cellules = (0..largeur * self.hauteur).map(|_i| Cellule::Morte).collect(); } /// Définit la hauteur de l'univers. /// /// Cela va tuer toutes les cellules. pub fn set_hauteur(&mut self, hauteur: u32) { self.hauteur = hauteur; self.cellules = (0..self.largeur * hauteur).map(|_i| Cellule::Morte).collect(); } } }
Nous allons créer un autre bloc impl Univers
dans notre fichier
wasm-jeu-de-la-vie
sans l'attribut #[wasm_bindgen]
. Il y a quelques
fonctions que nous avons besoin pour tester que nous ne souhaitons pas exposer
au JavaScript. Les fonctions WebAssembly générées par Rust ne peut pas retourner
des références empruntées. Essayez de compiler le WebAssembly généré par Rust
avec l'attribut et constatez les erreurs que vous obtenez.
Nous allons écrire l'implémentation de get_cellules
pour obtenir le contenu de
cellules
d'un Univers
. Nous allons aussi écrire une fonction set_cellules
pour que nous puissions donner vie à des cellules
d'un Univers
.
#![allow(unused)] fn main() { impl Univers { /// Donne toutes les cellules mortes et vivantes de l'univers. pub fn get_cellules(&self) -> &[Cellule] { &self.cellules } /// Définit les cellules vivantes de l'univers en lui fournissant la ligne /// et la colonne de chacune des cellules dans un tableau. pub fn set_cellules(&mut self, cellules: &[(u32, u32)]) { for (ligne, colonne) in cellules.iter().cloned() { let indice = self.get_index(ligne, colonne); self.cellules[indice] = Cellule::Vivante; } } } }
Maintenant nous pouvons créer notre test dans le fichier
wasm-jeu-de-la-vie/tests/web.rs
.
Avant de nous lancer, nous constatons qu'il existe déjà un test qui fonctionne
dans ce fichier. Vous pouvez confirmer que le test du WebAssembly généré par
Rust fonctionne en exécutant wasm-pack test --chrome --headless
dans le
dossier wasm-jeu-de-la-vie
. Vous pouvez utiliser les options --firefox
,
--safari
, et --node
pour tester votre code dans ces navigateurs.
Dans le fichier wasm-jeu-de-la-vie/tests/web.rs
, nous devons importer notre
crate wasm_jeu_de_la_vie
et le type Univers
.
#![allow(unused)] fn main() { extern crate wasm_jeu_de_la_vie; // (facultatif en Rust 2018) use wasm_jeu_de_la_vie::Univers; }
Dans le fichier wasm-jeu-de-la-vie/tests/web.rs
, nous allons ajouter quelques
fonctions qui créent des créateurs de vaisseaux spatiaux.
Nous allons en ajouter une pour créer notre vaisseau spatial initial lorsque
nous appellerons la fonction tick
et nous voulons qu'il soit toujours là après
une tick
. Nous avons choisi les cellules que nous voulons donner vie pour
créer notre vaisseau spatial dans la fonction vaisseau_spatial_initial
. La
position du vaisseau spatial dans la fonction vaisseau_spatial_attendu
dans
la tick
suivant vaisseau_spatial_initial
a été calculée manuellement. Vous
pouvez vérifier par vous-même que les cellules du vaisseau spatial initial sont
les mêmes que celles attendues après une tick
.
#![allow(unused)] fn main() { #[cfg(test)] pub fn vaisseau_spatial_initial() -> Univers { let mut univers = Univers::new(); univers.set_largeur(6); univers.set_hauteur(6); univers.set_cellules(&[(1,2), (2,3), (3,1), (3,2), (3,3)]); univers } #[cfg(test)] pub fn vaisseau_spatial_attendu() -> Univers { let mut univers = Univers::new(); univers.set_largeur(6); univers.set_hauteur(6); univers.set_cellules(&[(2,1), (2,3), (3,2), (3,3), (4,2)]); univers } }
Maintenant nous allons écrire l'implémentation de notre fonction test_tick
.
Pour commencer, nous allons créer une instance de notre
vaisseau_spatial_initial()
et de notre vaisseau_spatial_attendu()
. Ensuite,
nous appellerons tick
sur univers_initial
. Enfin, nous utiliserons la macro
assert_eq!
pour faire appel à get_cellules()
pour s'assurer que
univers_initial
et univers_attendu
ont la même valeur pour leur tableau de
Cellules
. Nous avons ajouté l'attribut #[wasm_bindgen_test]
à notre bloc de
code pour que nous puissions tester notre code WebAssembly généré par Rust et
utiliser wasm-pack test
pour tester le code WebAssembly.
#![allow(unused)] fn main() { #[wasm_bindgen_test] pub fn test_tick() { // On crée un petit univers avec un petit vaisseau spatial, pour tester ! let mut univers_initial = vaisseau_spatial_initial(); // C'est ce à quoi doit ressembler notre vaisseau spatial après une tick // dans notre univers. let univers_attendu = vaisseau_spatial_attendu(); // Appelons `tick` et voyons ensuite si les cellules dans les `Univers` sont // les mêmes. univers_initial.tick(); assert_eq!(&univers_initial.get_cells(), &univers_attendu.get_cells()); } }
Exécutez les tests dans le dossier wasm-jeu-de-la-vie
en exécutant
wasm-pack test --firefox --headless
.