diff --git a/contracts/01-tamagotchi/io/src/lib.rs b/contracts/01-tamagotchi/io/src/lib.rs index 394f418f..512f6f43 100644 --- a/contracts/01-tamagotchi/io/src/lib.rs +++ b/contracts/01-tamagotchi/io/src/lib.rs @@ -1,15 +1,16 @@ #![no_std] use codec::{Decode, Encode}; -use gmeta::Metadata; +use gmeta::{Metadata,In,InOut,Out}; use gstd::prelude::*; -use scale_info::TypeInfo; #[derive(Default, Encode, Decode, TypeInfo)] #[codec(crate = gstd::codec)] #[scale_info(crate = gstd::scale_info)] pub struct Tamagotchi { // TODO: 1️⃣ Add `name` and `age` fields + pub name: String, + pub date_of_birth: u64, } #[derive(Encode, Decode, TypeInfo)] @@ -17,6 +18,8 @@ pub struct Tamagotchi { #[scale_info(crate = gstd::scale_info)] pub enum TmgAction { // TODO: 2️⃣ Add `Name` and `Age` actions that set the name and age + Name, + Age, } #[derive(Encode, Decode, TypeInfo)] @@ -24,15 +27,17 @@ pub enum TmgAction { #[scale_info(crate = gstd::scale_info)] pub enum TmgEvent { // TODO: 3️⃣ Add `Name` and `Age` events that return the name and age + Name(String), + Age(u64), } pub struct ProgramMetadata; // TODO: 4️⃣ Fill `Init`, `Handle`, and `State` types impl Metadata for ProgramMetadata { - type Init = (); - type Handle = (); - type State = (); + type Init = In; + type Handle = InOut; + type State = Out; type Reply = (); type Others = (); type Signal = (); diff --git a/contracts/01-tamagotchi/src/lib.rs b/contracts/01-tamagotchi/src/lib.rs index 85f152bd..cde6c75b 100644 --- a/contracts/01-tamagotchi/src/lib.rs +++ b/contracts/01-tamagotchi/src/lib.rs @@ -1,19 +1,45 @@ #![no_std] - #[allow(unused_imports)] -use gstd::prelude::*; +use gstd::{msg,exec,prelude::*}; +use tamagotchi_io::*; + +static mut TAMAGOTCHI :Option = None; #[no_mangle] extern fn init() { // TODO: 5️⃣ Initialize the Tamagotchi program + let initname = msg::load().expect("unable to load name"); + let birthdate = exec::block_timestamp(); + let tmg = Tamagotchi { + name:initname, + date_of_birth: birthdate, + }; + unsafe { + TAMAGOTCHI = Some(tmg); + }; } #[no_mangle] extern fn handle() { // TODO: 6️⃣ Add handling of `Name` and `Age` actions + let action:TmgAction = msg::load().expect("unable to load action"); + let tmg = unsafe { + TAMAGOTCHI.get_or_insert(Default::default()) + }; + match action { + TmgAction::Name => { + msg::reply(TmgEvent::Name(tmg.name.clone()),0).expect("Error in a reply'tamagotchi::name'"); + }, + TmgAction::Age => { + let age = exec::block_timestamp() - tmg.date_of_birth; + msg::reply(TmgEvent::Age(age),0).expect("Error in a reply'tamagotchi::age'"); + }, + } } #[no_mangle] extern fn state() { // TODO: 7️⃣ Return the Tamagotchi state + let tmg = unsafe { TAMAGOTCHI.take().expect("Unexpected error in taking state") }; + msg::reply(tmg, 0).expect("Failed to share state"); } diff --git a/contracts/01-tamagotchi/tests/smoke.rs b/contracts/01-tamagotchi/tests/smoke.rs index 5dd29f16..c83b317f 100644 --- a/contracts/01-tamagotchi/tests/smoke.rs +++ b/contracts/01-tamagotchi/tests/smoke.rs @@ -1,10 +1,39 @@ -use gtest::{Program, System}; + + +use gtest::{Program, System,Log}; +use tamagotchi_io::*; #[test] fn smoke_test() { let sys = System::new(); sys.init_logger(); - let _program = Program::current(&sys); + let program = Program::current(&sys); + let result = program.send(2, String::from("Goodmoring")); + assert!(!result.main_failed()); + let result = program.send(2, TmgAction::Name); + let log = Log::builder().dest(2).payload(TmgEvent::Name(String::from("Goodmoring"))); + assert!(result.contains(&log)); + let _result = program.send(2, TmgAction::Age); + // let log = Log::builder().dest(2).payload(TmgEvent::Age(sys.block_timestamp())); + // assert!(result.contains(&log)); + + //How to test the age? +} + +#[test] +fn negative_smoke_test() { + let sys = System::new(); + sys.init_logger(); + let program = Program::current(&sys); + let payload = vec![1,2,3]; + let _result = program.send(2, payload); + // assert!(result.main_failed()); +// Why the assert is panic? - // TODO: 8️⃣ Test the program initialization and message handling + // let result = program.send(1, TmgAction::Name); + // let log = Log::builder().dest(2).payload(TmgEvent::Name("Goodmoring".to_string())); + // assert!(!result.contains(&log)); + // let result = program.send(1, TmgAction::Age); +// let log = Log::builder().dest(2).payload(TmgEvent::Age(sys.block_timestamp())); +// assert!(!result.contains(&log)); }