Skip to content

Commit e0f306f

Browse files
devnet0xwar-inArcticae
authored
Add tests for the conversions crate (#944)
<!-- Reference any GitHub issues resolved by this PR --> Closes #599 ## Introduced changes Add tests for the conversions crate - class_hash - contract_address - felt252 - field_element - nonce - short_string - stark_felt - stark_hash ## Breaking changes <!-- List of all breaking changes, if applicable --> N/A ## Checklist <!-- Make sure all of these are complete --> - [X] Linked relevant issue - [ N/A] Updated relevant documentation - [X] Added relevant tests - [X] Performed self-review of the code - [N/A] Added changes to `CHANGELOG.md` --------- Co-authored-by: Marcin Warchoł <61014013+war-in@users.noreply.github.com> Co-authored-by: Tomasz Rejowski <34059895+Arcticae@users.noreply.github.com>
1 parent 8c08e6e commit e0f306f

File tree

12 files changed

+704
-0
lines changed

12 files changed

+704
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#[cfg(test)]
2+
mod tests_class_hash {
3+
use conversions::StarknetConversions;
4+
5+
use crate::helpers::hex::str_hex_to_stark_felt;
6+
use starknet_api::{core::ClassHash, hash::StarkFelt};
7+
8+
#[test]
9+
fn test_class_hash_conversions_happy_case() {
10+
let felt: StarkFelt = StarkFelt::new([1u8; 32]).unwrap();
11+
let class_hash = ClassHash(felt);
12+
13+
assert_eq!(class_hash, class_hash.to_contract_address().to_class_hash());
14+
assert_eq!(class_hash, class_hash.to_felt252().to_class_hash());
15+
assert_eq!(class_hash, class_hash.to_field_element().to_class_hash());
16+
assert_eq!(class_hash, class_hash.to_nonce().to_class_hash());
17+
assert_eq!(class_hash, class_hash.to_short_string().to_class_hash());
18+
assert_eq!(class_hash, class_hash.to_stark_felt().to_class_hash());
19+
assert_eq!(class_hash, class_hash.to_stark_hash().to_class_hash());
20+
}
21+
22+
#[test]
23+
fn test_class_hash_conversions_zero() {
24+
let felt: StarkFelt = StarkFelt::new([0u8; 32]).unwrap();
25+
let class_hash = ClassHash(felt);
26+
27+
assert_eq!(class_hash, class_hash.to_contract_address().to_class_hash());
28+
assert_eq!(class_hash, class_hash.to_felt252().to_class_hash());
29+
assert_eq!(class_hash, class_hash.to_field_element().to_class_hash());
30+
assert_eq!(class_hash, class_hash.to_nonce().to_class_hash());
31+
assert_eq!(class_hash, class_hash.to_short_string().to_class_hash());
32+
assert_eq!(class_hash, class_hash.to_stark_felt().to_class_hash());
33+
assert_eq!(class_hash, class_hash.to_stark_hash().to_class_hash());
34+
}
35+
36+
#[test]
37+
fn test_class_hash_conversions_limit() {
38+
// max_value from cairo_felt::PRIME_STR
39+
let mut max_value = "0x0800000000000011000000000000000000000000000000000000000000000000";
40+
let mut class_hash = ClassHash(str_hex_to_stark_felt(max_value));
41+
42+
assert_eq!(class_hash, class_hash.to_felt252().to_class_hash());
43+
assert_eq!(class_hash, class_hash.to_field_element().to_class_hash());
44+
assert_eq!(class_hash, class_hash.to_nonce().to_class_hash());
45+
assert_eq!(class_hash, class_hash.to_stark_felt().to_class_hash());
46+
assert_eq!(class_hash, class_hash.to_stark_hash().to_class_hash());
47+
48+
// PATRICIA_KEY_UPPER_BOUND for contract_address from starknet_api-0.4.1/src/core.rs:156
49+
max_value = "0x07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
50+
class_hash = ClassHash(str_hex_to_stark_felt(max_value));
51+
assert_eq!(class_hash, class_hash.to_contract_address().to_class_hash());
52+
53+
// Unknown source for this value, founded by try and error(cairo-lang-runner-2.2.0/src/short_string.rs).
54+
max_value = "0x0777777777777777777777777777777777777f7f7f7f7f7f7f7f7f7f7f7f7f7f";
55+
class_hash = ClassHash(str_hex_to_stark_felt(max_value));
56+
57+
assert_eq!(class_hash, class_hash.to_short_string().to_class_hash());
58+
}
59+
60+
#[test]
61+
fn test_class_hash_conversions_out_of_range() {
62+
// max_value from cairo_felt::PRIME_STR
63+
let mut max_value = "0x0800000000000011000000000000000000000000000000000000000000000001";
64+
let mut class_hash = ClassHash(str_hex_to_stark_felt(max_value));
65+
66+
assert_ne!(class_hash, class_hash.to_felt252().to_class_hash());
67+
assert_ne!(class_hash, class_hash.to_field_element().to_class_hash());
68+
assert_ne!(class_hash, class_hash.to_nonce().to_class_hash());
69+
assert_ne!(class_hash, class_hash.to_stark_felt().to_class_hash());
70+
assert_ne!(class_hash, class_hash.to_stark_hash().to_class_hash());
71+
72+
// PATRICIA_KEY_UPPER_BOUND for contract_address from starknet_api-0.4.1/src/core.rs:156
73+
max_value = "0x0800000000000000000000000000000000000000000000000000000000000000";
74+
class_hash = ClassHash(str_hex_to_stark_felt(max_value));
75+
assert!(std::panic::catch_unwind(|| class_hash.to_contract_address()).is_err());
76+
77+
// Unknown source for this value, founded by try and error(cairo-lang-runner-2.2.0/src/short_string.rs).
78+
max_value = "0x0777777777777777777777777777777777777f7f7f7f7f7f7f7f7f7f7f7f7f80";
79+
class_hash = ClassHash(str_hex_to_stark_felt(max_value));
80+
assert!(std::panic::catch_unwind(|| class_hash.to_short_string()).is_err());
81+
}
82+
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
#[cfg(test)]
2+
mod tests_contract_address {
3+
use crate::helpers::hex::str_hex_to_stark_felt;
4+
use conversions::StarknetConversions;
5+
use starknet_api::{
6+
core::{ContractAddress, PatriciaKey},
7+
hash::StarkFelt,
8+
};
9+
10+
#[test]
11+
fn test_contract_address_conversions_happy_case() {
12+
let felt: StarkFelt = StarkFelt::new([1u8; 32]).unwrap();
13+
let contract_address = ContractAddress(PatriciaKey::try_from(felt).unwrap());
14+
15+
assert_eq!(
16+
contract_address,
17+
contract_address.to_class_hash().to_contract_address(),
18+
);
19+
assert_eq!(
20+
contract_address,
21+
contract_address.to_felt252().to_contract_address()
22+
);
23+
assert_eq!(
24+
contract_address,
25+
contract_address.to_field_element().to_contract_address()
26+
);
27+
assert_eq!(
28+
contract_address,
29+
contract_address.to_nonce().to_contract_address()
30+
);
31+
assert_eq!(
32+
contract_address,
33+
contract_address.to_short_string().to_contract_address()
34+
);
35+
assert_eq!(
36+
contract_address,
37+
contract_address.to_stark_felt().to_contract_address()
38+
);
39+
assert_eq!(
40+
contract_address,
41+
contract_address.to_stark_hash().to_contract_address()
42+
);
43+
}
44+
45+
#[test]
46+
fn test_contract_address_conversions_zero() {
47+
let felt: StarkFelt = StarkFelt::new([0u8; 32]).unwrap();
48+
let contract_address = ContractAddress(PatriciaKey::try_from(felt).unwrap());
49+
50+
assert_eq!(
51+
contract_address,
52+
contract_address.to_class_hash().to_contract_address(),
53+
);
54+
assert_eq!(
55+
contract_address,
56+
contract_address.to_felt252().to_contract_address()
57+
);
58+
assert_eq!(
59+
contract_address,
60+
contract_address.to_field_element().to_contract_address()
61+
);
62+
assert_eq!(
63+
contract_address,
64+
contract_address.to_nonce().to_contract_address()
65+
);
66+
assert_eq!(
67+
contract_address,
68+
contract_address.to_short_string().to_contract_address()
69+
);
70+
assert_eq!(
71+
contract_address,
72+
contract_address.to_stark_felt().to_contract_address()
73+
);
74+
assert_eq!(
75+
contract_address,
76+
contract_address.to_stark_hash().to_contract_address()
77+
);
78+
}
79+
80+
#[test]
81+
fn test_contract_address_conversions_limit() {
82+
// PATRICIA_KEY_UPPER_BOUND for contract_address from starknet_api-0.4.1/src/core.rs:156
83+
let mut max_value = "0x07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
84+
let mut contract_address =
85+
ContractAddress(PatriciaKey::try_from(str_hex_to_stark_felt(max_value)).unwrap());
86+
87+
assert_eq!(
88+
contract_address,
89+
contract_address.to_class_hash().to_contract_address()
90+
);
91+
assert_eq!(
92+
contract_address,
93+
contract_address.to_felt252().to_contract_address()
94+
);
95+
assert_eq!(
96+
contract_address,
97+
contract_address.to_field_element().to_contract_address()
98+
);
99+
assert_eq!(
100+
contract_address,
101+
contract_address.to_nonce().to_contract_address()
102+
);
103+
assert_eq!(
104+
contract_address,
105+
contract_address.to_stark_felt().to_contract_address()
106+
);
107+
assert_eq!(
108+
contract_address,
109+
contract_address.to_stark_hash().to_contract_address()
110+
);
111+
112+
// Unknown source for this value, founded by try and error(cairo-lang-runner-2.2.0/src/short_string.rs).
113+
max_value = "0x0777777777777777777777777777777777777f7f7f7f7f7f7f7f7f7f7f7f7f7f";
114+
contract_address =
115+
ContractAddress(PatriciaKey::try_from(str_hex_to_stark_felt(max_value)).unwrap());
116+
117+
assert_eq!(
118+
contract_address,
119+
contract_address.to_short_string().to_contract_address()
120+
);
121+
}
122+
123+
#[test]
124+
fn test_contract_address_conversions_out_of_range() {
125+
// Can't set value bigger than max_value from PATRICIA_KEY_UPPER_BOUND
126+
// so we can't test all conversions.
127+
128+
// Unknown source for this value, founded by try and error(cairo-lang-runner-2.2.0/src/short_string.rs).
129+
let max_value = "0x0777777777777777777777777777777777777f7f7f7f7f7f7f7f7f7f7f7f7f80";
130+
let contract_address =
131+
ContractAddress(PatriciaKey::try_from(str_hex_to_stark_felt(max_value)).unwrap());
132+
133+
assert!(std::panic::catch_unwind(|| contract_address.to_short_string()).is_err());
134+
}
135+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#[cfg(test)]
2+
mod tests_felt252 {
3+
use crate::helpers::hex::str_hex_to_felt252;
4+
use cairo_felt::Felt252;
5+
use conversions::StarknetConversions;
6+
7+
#[test]
8+
fn test_felt252_conversions_happy_case() {
9+
let felt = Felt252::from(1u8);
10+
11+
assert_eq!(felt, felt.to_class_hash().to_felt252());
12+
assert_eq!(felt, felt.to_contract_address().to_felt252());
13+
assert_eq!(felt, felt.to_field_element().to_felt252());
14+
assert_eq!(felt, felt.to_nonce().to_felt252());
15+
assert_eq!(felt, felt.to_short_string().to_felt252());
16+
assert_eq!(felt, felt.to_stark_felt().to_felt252());
17+
assert_eq!(felt, felt.to_stark_hash().to_felt252());
18+
}
19+
20+
#[test]
21+
fn test_felt252_conversions_zero() {
22+
let felt = Felt252::from(0u8);
23+
24+
assert_eq!(felt, felt.to_class_hash().to_felt252());
25+
assert_eq!(felt, felt.to_contract_address().to_felt252());
26+
assert_eq!(felt, felt.to_field_element().to_felt252());
27+
assert_eq!(felt, felt.to_nonce().to_felt252());
28+
assert_eq!(felt, felt.to_short_string().to_felt252());
29+
assert_eq!(felt, felt.to_stark_felt().to_felt252());
30+
assert_eq!(felt, felt.to_stark_hash().to_felt252());
31+
}
32+
33+
#[test]
34+
fn test_felt252_conversions_limit() {
35+
// max_value from cairo_felt::PRIME_STR
36+
let mut max_value = "0x0800000000000011000000000000000000000000000000000000000000000000";
37+
let mut felt252 = str_hex_to_felt252(max_value);
38+
39+
assert_eq!(felt252, felt252.to_nonce().to_felt252());
40+
assert_eq!(felt252, felt252.to_field_element().to_felt252());
41+
assert_eq!(felt252, felt252.to_class_hash().to_felt252());
42+
assert_eq!(felt252, felt252.to_stark_felt().to_felt252());
43+
assert_eq!(felt252, felt252.to_stark_hash().to_felt252());
44+
45+
// PATRICIA_KEY_UPPER_BOUND for contract_address from starknet_api-0.4.1/src/core.rs:156
46+
max_value = "0x07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
47+
felt252 = str_hex_to_felt252(max_value);
48+
assert_eq!(felt252, felt252.to_contract_address().to_felt252());
49+
50+
// Unknown source for this value, founded by try and error(cairo-lang-runner-2.2.0/src/short_string.rs).
51+
max_value = "0x0777777777777777777777777777777777777f7f7f7f7f7f7f7f7f7f7f7f7f7f";
52+
felt252 = str_hex_to_felt252(max_value);
53+
54+
assert_eq!(felt252, felt252.to_short_string().to_felt252());
55+
}
56+
57+
#[test]
58+
fn test_felt252_conversions_out_of_range() {
59+
// Can't set value bigger than max_value from cairo_felt::PRIME_STR
60+
// so we can't test all conversions.
61+
62+
// PATRICIA_KEY_UPPER_BOUND for contract_address from starknet_api-0.4.1/src/core.rs:156
63+
let mut max_value = "0x0800000000000000000000000000000000000000000000000000000000000000";
64+
let mut felt252: Felt252 = str_hex_to_felt252(max_value);
65+
assert!(std::panic::catch_unwind(|| felt252.to_contract_address()).is_err());
66+
67+
// Unknown source for this value, founded by try and error(cairo-lang-runner-2.2.0/src/short_string.rs).
68+
max_value = "0x0777777777777777777777777777777777777f7f7f7f7f7f7f7f7f7f7f7f7f80";
69+
felt252 = str_hex_to_felt252(max_value);
70+
assert!(std::panic::catch_unwind(|| felt252.to_short_string()).is_err());
71+
}
72+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#[cfg(test)]
2+
mod tests_field_elements {
3+
use crate::helpers::hex::str_hex_to_field_element;
4+
use conversions::StarknetConversions;
5+
use starknet::core::types::FieldElement;
6+
7+
#[test]
8+
fn test_field_elements_conversions_happy_case() {
9+
let field_element = FieldElement::from(1u8);
10+
11+
assert_eq!(
12+
field_element,
13+
field_element.to_class_hash().to_field_element()
14+
);
15+
assert_eq!(
16+
field_element,
17+
field_element.to_contract_address().to_field_element()
18+
);
19+
assert_eq!(field_element, field_element.to_felt252().to_field_element());
20+
assert_eq!(field_element, field_element.to_nonce().to_field_element());
21+
assert_eq!(
22+
field_element,
23+
field_element.to_short_string().to_field_element()
24+
);
25+
assert_eq!(
26+
field_element,
27+
field_element.to_stark_felt().to_field_element()
28+
);
29+
assert_eq!(
30+
field_element,
31+
field_element.to_stark_hash().to_field_element()
32+
);
33+
}
34+
35+
#[test]
36+
fn test_field_elements_conversions_zero() {
37+
let field_element = FieldElement::from(0u8);
38+
39+
assert_eq!(
40+
field_element,
41+
field_element.to_class_hash().to_field_element()
42+
);
43+
assert_eq!(
44+
field_element,
45+
field_element.to_contract_address().to_field_element()
46+
);
47+
assert_eq!(field_element, field_element.to_felt252().to_field_element());
48+
assert_eq!(field_element, field_element.to_nonce().to_field_element());
49+
assert_eq!(
50+
field_element,
51+
field_element.to_short_string().to_field_element()
52+
);
53+
assert_eq!(
54+
field_element,
55+
field_element.to_stark_felt().to_field_element()
56+
);
57+
assert_eq!(
58+
field_element,
59+
field_element.to_stark_hash().to_field_element()
60+
);
61+
}
62+
63+
#[test]
64+
fn test_field_element_conversions_out_of_range() {
65+
// Can't set value bigger than max_value from cairo_felt::PRIME_STR
66+
// so we can't test all conversions.
67+
68+
// PATRICIA_KEY_UPPER_BOUND for contract_address from starknet_api-0.4.1/src/core.rs:156
69+
let mut max_value = "0x0800000000000000000000000000000000000000000000000000000000000000";
70+
let mut field_element = str_hex_to_field_element(max_value);
71+
assert!(std::panic::catch_unwind(|| field_element.to_contract_address()).is_err());
72+
73+
// Unknown source for this value, founded by try and error(cairo-lang-runner-2.2.0/src/short_string.rs).
74+
max_value = "0x0777777777777777777777777777777777777f7f7f7f7f7f7f7f7f7f7f7f7f80";
75+
field_element = str_hex_to_field_element(max_value);
76+
assert!(std::panic::catch_unwind(|| field_element.to_short_string()).is_err());
77+
}
78+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
mod class_hash;
2+
mod contract_address;
3+
mod felt252;
4+
mod field_elements;
5+
mod nonce;
6+
mod short_string;
7+
mod stark_felt;
8+
mod stark_hash;

0 commit comments

Comments
 (0)