Skip to content

Commit 92c3c1b

Browse files
authored
feat: Add clean method for list (#182)
## Pull Request type Please check the type of change your PR introduces: - [ ] Bugfix - [X] Feature - [ ] Code style update (formatting, renaming) - [ ] Refactoring (no functional changes, no API changes) - [ ] Build-related changes - [ ] Documentation content changes - [ ] Other (please describe): ## What is the current behavior? Issue Number: [#177](#177) ## What is the new behavior? - Added a clean component to List - Added unit test related to this component ## Does this introduce a breaking change? - [ ] Yes - [X] No ## Other information
1 parent 7bc7b8a commit 92c3c1b

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

src/storage/src/list.cairo

+6
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ trait ListTrait<T> {
2525
fn append(ref self: List<T>, value: T) -> u32;
2626
fn get(self: @List<T>, index: u32) -> Option<T>;
2727
fn set(ref self: List<T>, index: u32, value: T);
28+
fn clean(ref self: List<T>);
2829
fn pop_front(ref self: List<T>) -> Option<T>;
2930
fn array(self: @List<T>) -> Array<T>;
3031
}
@@ -71,6 +72,11 @@ impl ListImpl<T, impl TCopy: Copy<T>, impl TDrop: Drop<T>, impl TStore: Store<T>
7172
Store::write_at_offset(self.address_domain, base, offset, value).unwrap_syscall();
7273
}
7374

75+
fn clean(ref self: List<T>) {
76+
self.len = 0;
77+
Store::write(self.address_domain, self.base, self.len);
78+
}
79+
7480
fn pop_front(ref self: List<T>) -> Option<T> {
7581
if self.len == 0 {
7682
return Option::None;

src/storage/src/tests/list_test.cairo

+56
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ trait IAListHolder<TContractState> {
1313
fn do_set(
1414
ref self: TContractState, index: u32, addrs_value: ContractAddress, numbers_value: u256
1515
);
16+
fn do_clean(ref self: TContractState);
1617
fn do_pop_front(ref self: TContractState) -> (Option<ContractAddress>, Option<u256>);
1718
fn do_array(self: @TContractState) -> (Array<ContractAddress>, Array<u256>);
1819
}
@@ -67,6 +68,13 @@ mod AListHolder {
6768
n.set(index, numbers_value);
6869
}
6970

71+
fn do_clean(ref self: ContractState) {
72+
let mut a = self.addrs.read();
73+
let mut n = self.numbers.read();
74+
a.clean();
75+
n.clean();
76+
}
77+
7078
fn do_pop_front(ref self: ContractState) -> (Option<ContractAddress>, Option<u256>) {
7179
let mut a = self.addrs.read();
7280
let mut n = self.numbers.read();
@@ -359,4 +367,52 @@ mod tests {
359367
let (array_addr, array_number) = contract.do_array();
360368
assert((array_addr.len(), array_number.len()) == (0, 0), 'lens must be null');
361369
}
370+
371+
#[test]
372+
#[available_gas(100000000)]
373+
fn test_array_clean() {
374+
let contract = deploy_mock();
375+
let mock_addr = mock_addr();
376+
377+
contract.do_append(mock_addr, 100); // idx 0
378+
contract.do_append(mock_addr, 200); // idx 1
379+
contract.do_append(mock_addr, 300); // idx 2
380+
contract.do_clean();
381+
assert(contract.do_get_len() == (0, 0), 'is empty');
382+
}
383+
384+
#[test]
385+
#[available_gas(100000000)]
386+
fn test_array_clean_with_empty_array() {
387+
let contract = deploy_mock();
388+
let mock_addr = mock_addr();
389+
390+
assert(contract.do_get_len() == (0, 0), 'is empty');
391+
392+
contract.do_clean();
393+
394+
assert(contract.do_get_len() == (0, 0), 'is still empty');
395+
}
396+
397+
#[test]
398+
#[available_gas(100000000)]
399+
fn test_array_get_value_after_clean() {
400+
let contract = deploy_mock();
401+
let mock_addr = mock_addr();
402+
403+
contract.do_append(mock_addr, 100); // idx 0
404+
let (addr, number) = contract.do_get(0);
405+
assert(addr.is_some(), 'addr is some');
406+
assert(addr.unwrap() == mock_addr, 'should be mock_addr');
407+
assert(number.is_some(), 'number is some');
408+
assert(number.unwrap() == 100, 'should be 100');
409+
410+
contract.do_clean();
411+
412+
assert(contract.do_get_len() == (0, 0), 'len');
413+
414+
let (addr, number) = contract.do_get(0);
415+
assert(addr.is_none(), 'addr is none');
416+
assert(number.is_none(), 'number is none');
417+
}
362418
}

0 commit comments

Comments
 (0)