Skip to content

Commit 276a10e

Browse files
authored
Convert functions for u1 (#35)
* added assert_eq_bool * added convert functions for u1
1 parent 3e4698c commit 276a10e

6 files changed

Lines changed: 331 additions & 9 deletions

File tree

simf/asserts_test.simf

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
use crate::lib::asserts::{
2-
assert_eq_1, assert_eq_8, assert_eq_16, assert_eq_32, assert_eq_64,assert_eq_128, assert_eq_256,
3-
assert_none_1, assert_none_8, assert_none_16, assert_none_32, assert_none_64, assert_none_128, assert_none_256
2+
assert_eq_1,
3+
assert_eq_8,
4+
assert_eq_16,
5+
assert_eq_32,
6+
assert_eq_64,
7+
assert_eq_128,
8+
assert_eq_256,
9+
assert_eq_bool,
10+
assert_none_1,
11+
assert_none_8,
12+
assert_none_16,
13+
assert_none_32,
14+
assert_none_64,
15+
assert_none_128,
16+
assert_none_256
417
};
518
use crate::helper::if_test_this_function;
619

@@ -36,13 +49,14 @@ fn main() {
3649
match if_test_this_function(4, fn_idx) { true => { assert_eq_64(unwrap(a_u64), unwrap(b_u64)); }, false => (), };
3750
match if_test_this_function(5, fn_idx) { true => { assert_eq_128(unwrap(a_u128), unwrap(b_u128)); }, false => (), };
3851
match if_test_this_function(6, fn_idx) { true => { assert_eq_256(unwrap(a_u256), unwrap(b_u256)); }, false => (), };
52+
match if_test_this_function(7, fn_idx) { true => { assert_eq_bool(<u1>::into(unwrap(a_u1)), <u1>::into(unwrap(b_u1))); }, false => (), };
3953

4054
// Assert None
41-
match if_test_this_function(7, fn_idx) { true => { assert_none_1(a_u1); }, false => (), };
42-
match if_test_this_function(8, fn_idx) { true => { assert_none_8(a_u8); }, false => (), };
43-
match if_test_this_function(9, fn_idx) { true => { assert_none_16(a_u16); }, false => (), };
44-
match if_test_this_function(10, fn_idx) { true => { assert_none_32(a_u32); }, false => (), };
45-
match if_test_this_function(11, fn_idx) { true => { assert_none_64(a_u64); }, false => (), };
46-
match if_test_this_function(12, fn_idx) { true => { assert_none_128(a_u128); }, false => (), };
47-
match if_test_this_function(13, fn_idx) { true => { assert_none_256(a_u256); }, false => (), };
55+
match if_test_this_function(8, fn_idx) { true => { assert_none_1(a_u1); }, false => (), };
56+
match if_test_this_function(9, fn_idx) { true => { assert_none_8(a_u8); }, false => (), };
57+
match if_test_this_function(10, fn_idx) { true => { assert_none_16(a_u16); }, false => (), };
58+
match if_test_this_function(11, fn_idx) { true => { assert_none_32(a_u32); }, false => (), };
59+
match if_test_this_function(12, fn_idx) { true => { assert_none_64(a_u64); }, false => (), };
60+
match if_test_this_function(13, fn_idx) { true => { assert_none_128(a_u128); }, false => (), };
61+
match if_test_this_function(14, fn_idx) { true => { assert_none_256(a_u256); }, false => (), };
4862
}

simf/lib/asserts.simf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ pub fn assert_eq_256(a: u256, b: u256) {
3535
assert!(jet::eq_256(a, b));
3636
}
3737

38+
/// Asserts that two bool values are equal
39+
pub fn assert_eq_bool(a: bool, b: bool) {
40+
assert_eq_1(<bool>::into(a), <bool>::into(b));
41+
}
42+
3843
/// Asserts that provided `Option<u1>` value is a `None`
3944
pub fn assert_none_1(val: Option<u1>) {
4045
assert!(is_none::<u1>(val));

simf/lib/u1/convert.simf

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/// Widening uint conversions
2+
3+
/// Converts u1 to u8
4+
pub fn u1_to_u8(a: u1) -> u8 {
5+
jet::left_pad_low_1_8(a)
6+
}
7+
8+
/// Converts u1 to u16
9+
pub fn u1_to_u16(a: u1) -> u16 {
10+
jet::left_pad_low_1_16(a)
11+
}
12+
13+
/// Converts u1 to u32
14+
pub fn u1_to_u32(a: u1) -> u32 {
15+
jet::left_pad_low_1_32(a)
16+
}
17+
18+
/// Converts u1 to u64
19+
pub fn u1_to_u64(a: u1) -> u64 {
20+
jet::left_pad_low_1_64(a)
21+
}
22+
23+
/// Converts u1 to u128
24+
pub fn u1_to_u128(a: u1) -> u128 {
25+
let a_u64: u64 = u1_to_u64(a);
26+
27+
<(u64, u64)>::into((0, a_u64))
28+
}
29+
30+
/// Converts u1 to u256
31+
pub fn u1_to_u256(a: u1) -> u256 {
32+
let a_u128: u128 = u1_to_u128(a);
33+
34+
<(u128, u128)>::into((0, a_u128))
35+
}
36+
37+
/// Type conversions
38+
39+
/// Converts u1 to bool
40+
pub fn u1_to_bool(a: u1) -> bool {
41+
<u1>::into(a)
42+
}

simf/u1_convert_test.simf

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
use crate::lib::u1::convert::{
2+
u1_to_u8,
3+
u1_to_u16,
4+
u1_to_u32,
5+
u1_to_u64,
6+
u1_to_u128,
7+
u1_to_u256,
8+
u1_to_bool
9+
};
10+
use crate::lib::u128::eq_128;
11+
use crate::lib::asserts::assert_eq_bool;
12+
use crate::helper::if_test_this_function;
13+
14+
fn main() {
15+
let fn_idx: u8 = witness::FUNCTION_INDEX;
16+
17+
let a: u1 = witness::FIRST_ARG;
18+
19+
let expected: u256 = witness::EXPECTED;
20+
21+
match if_test_this_function(0, fn_idx) {
22+
true => {
23+
let (_, _, _, expected): (u64, u64, u64, u64) = <u256>::into(expected);
24+
let (_, _, _, expected): (u16, u16, u16, u16) = <u64>::into(expected);
25+
let (_, expected): (u8, u8) = <u16>::into(expected);
26+
27+
assert!(jet::eq_8(u1_to_u8(a), expected));
28+
},
29+
false => {},
30+
};
31+
32+
match if_test_this_function(1, fn_idx) {
33+
true => {
34+
let (_, _, _, expected): (u64, u64, u64, u64) = <u256>::into(expected);
35+
let (_, _, _, expected): (u16, u16, u16, u16) = <u64>::into(expected);
36+
37+
assert!(jet::eq_16(u1_to_u16(a), expected));
38+
},
39+
false => {},
40+
};
41+
42+
match if_test_this_function(2, fn_idx) {
43+
true => {
44+
let (_, _, _, expected): (u64, u64, u64, u64) = <u256>::into(expected);
45+
let (_, expected): (u32, u32) = <u64>::into(expected);
46+
47+
assert!(jet::eq_32(u1_to_u32(a), expected));
48+
},
49+
false => {},
50+
};
51+
52+
match if_test_this_function(3, fn_idx) {
53+
true => {
54+
let (_, _, _, expected): (u64, u64, u64, u64) = <u256>::into(expected);
55+
56+
assert!(jet::eq_64(u1_to_u64(a), expected));
57+
},
58+
false => {},
59+
};
60+
61+
match if_test_this_function(4, fn_idx) {
62+
true => {
63+
let (_, expected): (u128, u128) = <u256>::into(expected);
64+
65+
assert!(eq_128(u1_to_u128(a), expected));
66+
},
67+
false => {},
68+
};
69+
70+
match if_test_this_function(5, fn_idx) {
71+
true => {
72+
assert!(jet::eq_256(u1_to_u256(a), expected));
73+
},
74+
false => {},
75+
};
76+
77+
match if_test_this_function(6, fn_idx) {
78+
true => {
79+
let expected_bool: bool = jet::eq_256(expected, 1);
80+
assert_eq_bool(u1_to_bool(a), expected_bool);
81+
},
82+
false => {},
83+
};
84+
}

tests/asserts_test.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ enum FunctionToTest {
1919
AssertEq64,
2020
AssertEq128,
2121
AssertEq256,
22+
AssertEqBool,
2223

2324
AssertNone1,
2425
AssertNone8,
@@ -113,6 +114,10 @@ fn build_witness(function: FunctionToTest, same: bool, none: bool) -> AssertsTes
113114
(witness.first_arg_u256, witness.second_arg_u256) =
114115
(Some([a as u8; 32]), Some([b as u8; 32]));
115116
}
117+
FunctionToTest::AssertEqBool => {
118+
let (a, b) = generate_uints_in_one_range(same, 0, 1u128);
119+
(witness.first_arg_u1, witness.second_arg_u1) = (Some(a as u8), Some(b as u8));
120+
}
116121
FunctionToTest::AssertNone1 => {
117122
if none {
118123
witness.first_arg_u1 = None;
@@ -315,6 +320,28 @@ mod asserts_test {
315320
)
316321
}
317322

323+
#[simplex::test]
324+
fn assert_eq_bool_happy_path(context: simplex::TestContext) -> anyhow::Result<()> {
325+
run_assert(
326+
&context,
327+
FunctionToTest::AssertEqBool,
328+
true,
329+
false,
330+
Expect::Ok,
331+
)
332+
}
333+
334+
#[simplex::test]
335+
fn assert_eq_bool_unhappy_path(context: simplex::TestContext) -> anyhow::Result<()> {
336+
run_assert(
337+
&context,
338+
FunctionToTest::AssertEqBool,
339+
false,
340+
false,
341+
Expect::AssertFailed,
342+
)
343+
}
344+
318345
// ---------- assert_none: happy = None arg, unhappy = Some arg ----------
319346
#[simplex::test]
320347
fn assert_none_1_happy_path(context: simplex::TestContext) -> anyhow::Result<()> {

tests/u1_convert_test.rs

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
mod common;
2+
3+
use primitive_types::U256;
4+
use rand::Rng;
5+
6+
use common::core::{Expect, run};
7+
8+
use simplicityhl_std::artifacts::u1_convert_test::U1ConvertTestProgram;
9+
use simplicityhl_std::artifacts::u1_convert_test::derived_u1_convert_test::{
10+
U1ConvertTestArguments, U1ConvertTestWitness,
11+
};
12+
13+
enum FunctionToTest {
14+
U1ToU8,
15+
U1ToU16,
16+
U1ToU32,
17+
U1ToU64,
18+
U1ToU128,
19+
U1ToU256,
20+
U1ToBool,
21+
}
22+
23+
#[inline]
24+
fn op(o: FunctionToTest) -> u8 {
25+
o as u8
26+
}
27+
28+
fn program() -> U1ConvertTestProgram {
29+
U1ConvertTestProgram::new(U1ConvertTestArguments {})
30+
}
31+
32+
fn build_witness(function: u8, a: u8, expected: [u8; 32]) -> U1ConvertTestWitness {
33+
U1ConvertTestWitness {
34+
function_index: function,
35+
first_arg: a,
36+
expected,
37+
}
38+
}
39+
40+
mod u1_convert_test {
41+
use super::*;
42+
43+
#[simplex::test]
44+
fn u1_convert_test_u1_to_u8(context: simplex::TestContext) -> anyhow::Result<()> {
45+
let a = rand::thread_rng().gen_range(0..=1);
46+
47+
run(
48+
&context,
49+
program(),
50+
build_witness(op(FunctionToTest::U1ToU8), a, U256::from(a).to_big_endian()),
51+
Expect::Ok,
52+
)
53+
}
54+
55+
#[simplex::test]
56+
fn u1_convert_test_u1_to_u16(context: simplex::TestContext) -> anyhow::Result<()> {
57+
let a = rand::thread_rng().gen_range(0..=1);
58+
59+
run(
60+
&context,
61+
program(),
62+
build_witness(
63+
op(FunctionToTest::U1ToU16),
64+
a,
65+
U256::from(a).to_big_endian(),
66+
),
67+
Expect::Ok,
68+
)
69+
}
70+
71+
#[simplex::test]
72+
fn u1_convert_test_u1_to_u32(context: simplex::TestContext) -> anyhow::Result<()> {
73+
let a = rand::thread_rng().gen_range(0..=1);
74+
75+
run(
76+
&context,
77+
program(),
78+
build_witness(
79+
op(FunctionToTest::U1ToU32),
80+
a,
81+
U256::from(a).to_big_endian(),
82+
),
83+
Expect::Ok,
84+
)
85+
}
86+
87+
#[simplex::test]
88+
fn u1_convert_test_u1_to_u64(context: simplex::TestContext) -> anyhow::Result<()> {
89+
let a = rand::thread_rng().gen_range(0..=1);
90+
91+
run(
92+
&context,
93+
program(),
94+
build_witness(
95+
op(FunctionToTest::U1ToU64),
96+
a,
97+
U256::from(a).to_big_endian(),
98+
),
99+
Expect::Ok,
100+
)
101+
}
102+
103+
#[simplex::test]
104+
fn u1_convert_test_u1_to_u128(context: simplex::TestContext) -> anyhow::Result<()> {
105+
let a = rand::thread_rng().gen_range(0..=1);
106+
107+
run(
108+
&context,
109+
program(),
110+
build_witness(
111+
op(FunctionToTest::U1ToU128),
112+
a,
113+
U256::from(a).to_big_endian(),
114+
),
115+
Expect::Ok,
116+
)
117+
}
118+
119+
#[simplex::test]
120+
fn u1_convert_test_u1_to_u256(context: simplex::TestContext) -> anyhow::Result<()> {
121+
let a = rand::thread_rng().gen_range(0..=1);
122+
123+
run(
124+
&context,
125+
program(),
126+
build_witness(
127+
op(FunctionToTest::U1ToU256),
128+
a,
129+
U256::from(a).to_big_endian(),
130+
),
131+
Expect::Ok,
132+
)
133+
}
134+
135+
#[simplex::test]
136+
fn u1_convert_test_split_u1_to_u1(context: simplex::TestContext) -> anyhow::Result<()> {
137+
let a = rand::thread_rng().gen_range(0..=1);
138+
139+
run(
140+
&context,
141+
program(),
142+
build_witness(
143+
op(FunctionToTest::U1ToBool),
144+
a,
145+
U256::from(a).to_big_endian(),
146+
),
147+
Expect::Ok,
148+
)
149+
}
150+
}

0 commit comments

Comments
 (0)