Skip to content

Commit 695c2b9

Browse files
author
root28root
committed
simplenft: keep single nft module; demote doc comment to line comment
1 parent e9b54ba commit 695c2b9

5 files changed

Lines changed: 125 additions & 23 deletions

File tree

escrow/Move.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,8 @@ version = "0.0.1"
44
authors = ["Rootmhz"]
55

66
[addresses]
7+
std = "0x1"
78
Escrow = "0xb35962eed27b9a272d82673f2b7a99e7257b7b1a9af02c1a09143dacbaf498bd"
9+
10+
[dependencies]
11+
MoveStdlib = { local = "../minimarket/vendor/aptos-core/aptos-move/framework/move-stdlib" }

escrow/tests/escrow_tests.move

Lines changed: 63 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,87 @@
1-
module Escrow::escrow_tests {
2-
use Escrow::escrow;
1+
#[test_only]
2+
module 0xb35962eed27b9a272d82673f2b7a99e7257b7b1a9af02c1a09143dacbaf498bd::escrow_tests {
3+
use 0x1::signer;
4+
use 0x1::vector;
5+
use 0xb35962eed27b9a272d82673f2b7a99e7257b7b1a9af02c1a09143dacbaf498bd::escrow;
36

47
const BUYER: address = @0x1;
58
const SELLER: address = @0x2;
69

7-
#[test]
8-
public fun full_success_flow() {
10+
// Мусорка, чтобы не было implicit drop для Wallet/Deal
11+
struct Trash has key {
12+
buyers: vector<escrow::Wallet>,
13+
sellers: vector<escrow::Wallet>,
14+
deals: vector<escrow::Deal>,
15+
}
16+
17+
public entry fun init_trash(s: &signer) {
18+
move_to(s, Trash {
19+
buyers: vector::empty<escrow::Wallet>(),
20+
sellers: vector::empty<escrow::Wallet>(),
21+
deals: vector::empty<escrow::Deal>(),
22+
});
23+
}
24+
25+
fun sink_all(s: &signer, bw: escrow::Wallet, sw: escrow::Wallet, d: escrow::Deal) acquires Trash {
26+
let t = borrow_global_mut<Trash>(signer::address_of(s));
27+
vector::push_back(&mut t.buyers, bw);
28+
vector::push_back(&mut t.sellers, sw);
29+
vector::push_back(&mut t.deals, d);
30+
}
31+
32+
// === happy path: deposit -> fund -> release ===
33+
#[test(admin = @0xAA)]
34+
public entry fun test_happy(admin: &signer) acquires Trash {
35+
init_trash(admin);
36+
937
let bw = escrow::new_wallet();
1038
let sw = escrow::new_wallet();
1139

1240
escrow::deposit(&mut bw, 150);
1341
let d = escrow::create(BUYER, SELLER, 100);
1442

1543
escrow::fund(BUYER, &mut bw, &mut d);
16-
assert!(escrow::balance(&bw) == 50, 0);
17-
1844
escrow::release(SELLER, &mut sw, &mut d);
45+
46+
assert!(escrow::balance(&bw) == 50, 0);
1947
assert!(escrow::balance(&sw) == 100, 1);
48+
49+
sink_all(admin, bw, sw, d);
2050
}
2151

22-
#[test]
23-
public fun refund_flow() {
52+
// Нельзя фондить недостаточную сумму (E_INSUFFICIENT = 4)
53+
#[test(admin = @0xAB)]
54+
#[expected_failure(abort_code = 4, location = 0xb35962eed27b9a272d82673f2b7a99e7257b7b1a9af02c1a09143dacbaf498bd::escrow)]
55+
public entry fun test_insufficient(admin: &signer) acquires Trash {
56+
init_trash(admin);
57+
2458
let bw = escrow::new_wallet();
2559
let sw = escrow::new_wallet();
2660

27-
escrow::deposit(&mut bw, 100);
61+
escrow::deposit(&mut bw, 50); // меньше, чем нужно
2862
let d = escrow::create(BUYER, SELLER, 100);
2963

64+
// упадёт по E_INSUFFICIENT (4)
3065
escrow::fund(BUYER, &mut bw, &mut d);
31-
escrow::refund(BUYER, &mut bw, &mut d);
3266

33-
assert!(escrow::balance(&bw) == 100, 2);
34-
assert!(escrow::balance(&sw) == 0, 3);
67+
sink_all(admin, bw, sw, d);
68+
}
69+
70+
// Нельзя фондить не-байеру (E_NOT_BUYER = 5)
71+
#[test(admin = @0xAC)]
72+
#[expected_failure(abort_code = 5, location = 0xb35962eed27b9a272d82673f2b7a99e7257b7b1a9af02c1a09143dacbaf498bd::escrow)]
73+
public entry fun test_not_buyer(admin: &signer) acquires Trash {
74+
init_trash(admin);
75+
76+
let bw = escrow::new_wallet();
77+
let sw = escrow::new_wallet();
78+
79+
escrow::deposit(&mut bw, 150);
80+
let d = escrow::create(BUYER, SELLER, 100);
81+
82+
// адрес не совпадает с BUYER
83+
escrow::fund(@0xDEAD, &mut bw, &mut d);
84+
85+
sink_all(admin, bw, sw, d);
3586
}
3687
}

mytoken/Move.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,8 @@ version = "0.0.1"
44
authors = ["Rootmhz"]
55

66
[addresses]
7+
std = "0x1"
78
MyToken = "0xb35962eed27b9a272d82673f2b7a99e7257b7b1a9af02c1a09143dacbaf498bd"
9+
10+
[dependencies]
11+
MoveStdlib = { local = "../minimarket/vendor/aptos-core/aptos-move/framework/move-stdlib" }
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@ module SimpleNFT::nft {
1919
}
2020
}
2121

22+
/// Минтим ровно один NFT (#0) для демо
2223
public fun mint(r: &mut Registry, to: address, name: vector<u8>) {
23-
// Разрешаем ровно один минт (#0) для демо
2424
assert!(!r.has0, 1);
2525
let id = r.next_id;
2626
r.next_id = id + 1;
2727

28-
// Заполняем поля примитивами — никаких ресурсов = нет проблем с drop
2928
r.id0 = id;
3029
r.name0 = name;
3130
r.owner0 = to;
@@ -44,7 +43,7 @@ module SimpleNFT::nft {
4443
r.owner0
4544
}
4645

47-
// «Поглощаем» реестр, чтобы не было implicit drop предупреждений
46+
// «Поглощаем» реестр, чтобы не было implicit drop
4847
fun destroy_registry(r: Registry) {
4948
let Registry {
5049
next_id: _,
@@ -55,7 +54,7 @@ module SimpleNFT::nft {
5554
} = r;
5655
}
5756

58-
/// DEMO: создаём реестр, минтим NFT #0 → переводимпроверяем владельца
57+
/// DEMO: минт → трансферпроверка владельца
5958
public entry fun entry_demo(_s: &signer) {
6059
let r = new_registry();
6160
mint(&mut r, @0x1, b"Demo NFT");
@@ -64,4 +63,10 @@ module SimpleNFT::nft {
6463
assert!(owner == @0x2, 0);
6564
destroy_registry(r);
6665
}
66+
67+
// Для юнит-тестов: публичный «съедатель» реестра
68+
#[test_only]
69+
public fun destroy_for_test(r: Registry) {
70+
destroy_registry(r);
71+
}
6772
}
Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,52 @@
1-
module SimpleNFT::nft_tests {
2-
use SimpleNFT::nft;
1+
#[test_only]
2+
module 0xb35962eed27b9a272d82673f2b7a99e7257b7b1a9af02c1a09143dacbaf498bd::simple_nft_tests {
3+
use 0xb35962eed27b9a272d82673f2b7a99e7257b7b1a9af02c1a09143dacbaf498bd::nft;
34

45
const A1: address = @0x1;
56
const A2: address = @0x2;
67

78
#[test]
8-
public fun mint_and_transfer() {
9-
let n = nft::mint(0, A1);
10-
assert!(nft::owner_of(&n) == A1, 0);
11-
nft::transfer(&mut n, A2);
12-
assert!(nft::owner_of(&n) == A2, 1);
9+
public entry fun test_mint_transfer_ok() {
10+
let r = nft::new_registry();
11+
12+
nft::mint(&mut r, A1, b"Test NFT");
13+
assert!(nft::get_owner(&r, 0) == A1, 0);
14+
15+
nft::transfer(&mut r, 0, A2);
16+
assert!(nft::get_owner(&r, 0) == A2, 1);
17+
18+
nft::destroy_for_test(r);
19+
}
20+
21+
// Повторный mint должен падать с кодом 1 из SimpleNFT::nft::mint
22+
#[test]
23+
#[expected_failure(abort_code = 1, location = SimpleNFT::nft)]
24+
public entry fun test_mint_twice_fails() {
25+
let r = nft::new_registry();
26+
nft::mint(&mut r, A1, b"x");
27+
// второй mint -> abort(1)
28+
nft::mint(&mut r, A1, b"y");
29+
// не дойдём, но чтобы удовлетворить типы:
30+
nft::destroy_for_test(r);
31+
}
32+
33+
// Неверный id при transfer -> abort(3) в SimpleNFT::nft::transfer
34+
#[test]
35+
#[expected_failure(abort_code = 3, location = SimpleNFT::nft)]
36+
public entry fun test_transfer_wrong_id_fails() {
37+
let r = nft::new_registry();
38+
nft::mint(&mut r, A1, b"x");
39+
nft::transfer(&mut r, /*wrong*/ 999, A2);
40+
nft::destroy_for_test(r);
41+
}
42+
43+
// Неверный id при get_owner -> abort(5) в SimpleNFT::nft::get_owner
44+
#[test]
45+
#[expected_failure(abort_code = 5, location = SimpleNFT::nft)]
46+
public entry fun test_get_owner_wrong_id_fails() {
47+
let r = nft::new_registry();
48+
nft::mint(&mut r, A1, b"x");
49+
let _ = nft::get_owner(&r, /*wrong*/ 123);
50+
nft::destroy_for_test(r);
1351
}
1452
}

0 commit comments

Comments
 (0)