Skip to content

Commit

Permalink
Increase test coverage on std-lib (#6087)
Browse files Browse the repository at this point in the history
## Description

Completes in-language tests for
#6038.

Any tests in the std-lib have been moved into the
`test/src/in_language_tests` folder. This has been done to ensure
imports behave as expected and fields that should be public are.

While many of the functions that have new tests are used elsewhere in
the tests, there were no tests to explicitly check that it is behaving
as expected.

# The following tests have been added:

## Address: 
- bits()
- Eq
- Neq
- b256.into()
- b256::from()
- Hash
- is_zero()

## Assert
- Assert revert when not true
- Assert_eq revert when not true
- Assert_ne revert when not false

## Asset Id
- Eq
- Neq
- b256.into()
- b256::from()
- new()
- default()
- bits()
- is_zero()

## B512
- Eq
- Neq
- Into
- b256::from
- b256.into()
- new()
- bits()
- is_zero()

## Bytes
- with_capacity()
- capacity()
- is_empty()
- ptr()
- b256.into()
- b256::from()
- clone()

## ContractId
- bits()
- Eq
- Neq
- b256.into()
- b256::from()
- is_zero()

## Hash
- write_str_array()
- Hash for 2, 3, 4, 5 tuple
- Hash 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 arrays
- sha256()
- sha256_str_array()
-  kekkack()

## Identity
- Eq
- Neq
- Hash

## Option
- Neq
- ok_or()
- expect()

## Result
- Neq
- expect()

## String
- ptr()
- Bytes::from()
- Bytes.into()
- as_raw_slice()

## U128
- into u8
- into u16
- into u32
- into u64
- From (u64, u64)
- Into (u64, u64)
- (u64, u64)::from
- (u64, u64).into()
- Eq
- Neq
- Ord
- new()
- min()
- max()
- bits()
- upper()
- lower()
- log2
- u8.into()
- u8::from()
- u16.into()
- u16::from()
- u32.into()
- u32::from()
- u64.into()
- u64::from()
- u256.into()
- u256::from()

## Primitive Conversions
### b256
- into u256
### u16
- into u8
### u32
- into u8
- into u16
### u64
- into u8
- into u16
- into u32
### u256
- into u8
- into u16
- into u32
- into u64
- into b256
- into u256
- into tuple

## EvmAddrsss
- bits()
- Eq
- Neq
- is_zero()
- b256::from()
- b256.into()

# Additional Edge cases have been added:
 
## Address
- Min & max edge cases

## Alloc
- Check alloc() does not exceed bounds
- Check realloc() same size
- Check realloc() less size does nothing
- Check realloc() excludes values if less than current
- realloc() reverts on unallocated memory
- alloc_bytes() does not exceed bounds
- realloc_bytes() same size
- realloc_bytes() less size does nothing
- realloc_bytes() excludes values if less than current
- realloc_bytes() reverts on unallocated memory

## Assert
- No tests for array

## AssetId
- Min & max edge cases

## B512
- Min & max edge cases

## Bytes
- Push increases capacity
- Pop does not change capacity
- Check get result when out of bounds
- Set front
- Set back
- Set does not change capacity
- Set twice
- Set behavior when out of bounds
- Insert front
- Insert back
- Insert changes capacity
- Insert behavior when out of bounds
- Remove front
- Remove back
- Remove does not change capacity
- Remove all
- Remove behavior when out of bounds
- Swap front
- Swap back
- Swap does not change capacity
- Swap behavior when out of bounds
- len() updates 
- Split twice
- Split capacity checks
- Split behavior when out of bounds
- Append changes capacity 

## ContractId
- Min & max edge cases

## Hash
- Min & max edge cases

## Identity
-  Min & max edge cases

## Option
- Coverage on all primitive types

## Result
- Coverage on all primitive types

## Revert
- Require reverts on false

## U128
- Revert on add when overflow
- Revert on sub when negative
- Revert on mul when overflow
- Revert on divide by zero
- Min & max edge cases

## Primitive Conversions
### b256
- Min & max edge cases
### u8
- Min & max edge cases
### u16
- Min & max edge cases
### u32
- Min & max edge cases
### u64
- Min & max edge cases
### u256
- Min & max edge cases

## EvmAddress
- Min & max edge cases 

## evm ecr recover
- Result error when failed to recover

The following issue have been discovered by writing these tests:
- #6085
- #6077
- #6086
- #6073
- #6037
- #6088
- #6104
- Addtional changes made in this PR. These include docs updates and a
private enum that should be public

## Checklist

- [x] I have linked to any relevant issues.
- [x] I have commented my code, particularly in hard-to-understand
areas.
- [ ] I have updated the documentation where relevant (API docs, the
reference, and the Sway book).
- [ ] If my change requires substantial documentation changes, I have
[requested support from the DevRel
team](https://github.com/FuelLabs/devrel-requests/issues/new/choose)
- [x] I have added tests that prove my fix is effective or that my
feature works.
- [x] I have added (or requested a maintainer to add) the necessary
`Breaking*` or `New Feature` labels where relevant.
- [x] I have done my best to ensure that my PR adheres to [the Fuel Labs
Code Review
Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md).
- [x] I have requested a review from the relevant team or maintainers.

---------

Co-authored-by: IGI-111 <igi-111@protonmail.com>
Co-authored-by: K1-R1 <77465250+K1-R1@users.noreply.github.com>
  • Loading branch information
3 people authored Jun 11, 2024
1 parent 2984831 commit 5e24673
Show file tree
Hide file tree
Showing 117 changed files with 8,382 additions and 2,758 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,7 @@ jobs:
- name: Install Forc
run: cargo install --locked --debug --path ./forc
- name: Run Unit Tests
run: forc build --path sway-lib-core && forc test --path sway-lib-core && forc build --path sway-lib-std && forc test --path sway-lib-std
run: forc build --path sway-lib-core && forc test --path sway-lib-core && forc build --path sway-lib-std && forc test --path sway-lib-std && forc build --path test/src/in_language_tests & forc test --path test/src/in_language_tests

forc-pkg-fuels-deps-check:
runs-on: ubuntu-latest
Expand Down
32 changes: 0 additions & 32 deletions sway-lib-std/src/address.sw
Original file line number Diff line number Diff line change
Expand Up @@ -125,35 +125,3 @@ impl Hash for Address {
bits.hash(state);
}
}

#[test]
fn test_address_from_b256() {
use ::assert::assert;

let my_address = Address::from(0x0000000000000000000000000000000000000000000000000000000000000001);
assert(
my_address
.bits() == 0x0000000000000000000000000000000000000000000000000000000000000001,
);
}

#[test]
fn test_address_into_b256() {
use ::assert::assert;
use ::convert::Into;

let address = Address::from(0x0000000000000000000000000000000000000000000000000000000000000001);
let b256_data: b256 = address.into();
assert(b256_data == 0x0000000000000000000000000000000000000000000000000000000000000001);
}

#[test]
fn test_address_zero() {
use ::assert::assert;

let address = Address::zero();
assert(address.is_zero());

let other_address = Address::from(0x0000000000000000000000000000000000000000000000000000000000000001);
assert(!other_address.is_zero());
}
52 changes: 0 additions & 52 deletions sway-lib-std/src/array_conversions/b256.sw
Original file line number Diff line number Diff line change
Expand Up @@ -173,55 +173,3 @@ impl b256 {
}
}
}

#[test]
fn test_b256_from_le_bytes() {
let bytes = [
32_u8, 31_u8, 30_u8, 29_u8, 28_u8, 27_u8, 26_u8, 25_u8, 24_u8, 23_u8, 22_u8,
21_u8, 20_u8, 19_u8, 18_u8, 17_u8, 16_u8, 15_u8, 14_u8, 13_u8, 12_u8, 11_u8,
10_u8, 9_u8, 8_u8, 7_u8, 6_u8, 5_u8, 4_u8, 3_u8, 2_u8, 1_u8,
];

let x = b256::from_le_bytes(bytes);

assert(x == 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20);
}

#[test]
fn test_b256_to_le_bytes() {
let x: b256 = 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20;

let bytes = x.to_le_bytes();

let mut i: u8 = 0;
while i < 32_u8 {
assert(bytes[i.as_u64()] == 32_u8 - i);
i += 1_u8;
}
}

#[test]
fn test_b256_from_be_bytes() {
let bytes = [
1_u8, 2_u8, 3_u8, 4_u8, 5_u8, 6_u8, 7_u8, 8_u8, 9_u8, 10_u8, 11_u8, 12_u8,
13_u8, 14_u8, 15_u8, 16_u8, 17_u8, 18_u8, 19_u8, 20_u8, 21_u8, 22_u8, 23_u8,
24_u8, 25_u8, 26_u8, 27_u8, 28_u8, 29_u8, 30_u8, 31_u8, 32_u8,
];

let x = b256::from_be_bytes(bytes);

assert(x == 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20);
}

#[test]
fn test_b256_to_be_bytes() {
let x: b256 = 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20;

let bytes = x.to_be_bytes();

let mut i: u8 = 0;
while i < 32_u8 {
assert(bytes[i.as_u64()] == i + 1_u8);
i += 1_u8;
}
}
34 changes: 0 additions & 34 deletions sway-lib-std/src/array_conversions/u16.sw
Original file line number Diff line number Diff line change
Expand Up @@ -122,37 +122,3 @@ impl u16 {
}
}
}

#[test]
fn test_u16_to_le_bytes() {
let x: u16 = 513;
let result = x.to_le_bytes();

assert(result[0] == 1_u8);
assert(result[1] == 2_u8);
}

#[test]
fn test_u16_from_le_bytes() {
let bytes = [1_u8, 2_u8];
let result = u16::from_le_bytes(bytes);

assert(result == 513_u16);
}

#[test]
fn test_u16_to_be_bytes() {
let x: u16 = 513;
let result = x.to_be_bytes();

assert(result[0] == 2_u8);
assert(result[1] == 1_u8);
}

#[test]
fn test_u16_from_be_bytes() {
let bytes = [2_u8, 1_u8];
let result = u16::from_be_bytes(bytes);

assert(result == 513_u16);
}
52 changes: 0 additions & 52 deletions sway-lib-std/src/array_conversions/u256.sw
Original file line number Diff line number Diff line change
Expand Up @@ -172,55 +172,3 @@ impl u256 {
}
}
}

#[test]
fn test_u256_from_le_bytes() {
let bytes = [
32_u8, 31_u8, 30_u8, 29_u8, 28_u8, 27_u8, 26_u8, 25_u8, 24_u8, 23_u8, 22_u8,
21_u8, 20_u8, 19_u8, 18_u8, 17_u8, 16_u8, 15_u8, 14_u8, 13_u8, 12_u8, 11_u8,
10_u8, 9_u8, 8_u8, 7_u8, 6_u8, 5_u8, 4_u8, 3_u8, 2_u8, 1_u8,
];

let x = u256::from_le_bytes(bytes);

assert(x == 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20u256);
}

#[test]
fn test_u256_to_le_bytes() {
let x: u256 = 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20u256;

let bytes = x.to_le_bytes();

let mut i: u8 = 0;
while i < 32_u8 {
assert(bytes[i.as_u64()] == 32_u8 - i);
i += 1_u8;
}
}

#[test]
fn test_u256_from_be_bytes() {
let bytes = [
1_u8, 2_u8, 3_u8, 4_u8, 5_u8, 6_u8, 7_u8, 8_u8, 9_u8, 10_u8, 11_u8, 12_u8,
13_u8, 14_u8, 15_u8, 16_u8, 17_u8, 18_u8, 19_u8, 20_u8, 21_u8, 22_u8, 23_u8,
24_u8, 25_u8, 26_u8, 27_u8, 28_u8, 29_u8, 30_u8, 31_u8, 32_u8,
];

let x = u256::from_be_bytes(bytes);

assert(x == 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20u256);
}

#[test]
fn test_u256_to_be_bytes() {
let x: u256 = 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20u256;

let bytes = x.to_be_bytes();

let mut i: u8 = 0;
while i < 32_u8 {
assert(bytes[i.as_u64()] == i + 1_u8);
i += 1_u8;
}
}
38 changes: 0 additions & 38 deletions sway-lib-std/src/array_conversions/u32.sw
Original file line number Diff line number Diff line change
Expand Up @@ -189,41 +189,3 @@ impl u32 {
}
}
}

#[test]
fn test_u32_to_le_bytes() {
let x: u32 = 67305985;
let result = x.to_le_bytes();

assert(result[0] == 1_u8);
assert(result[1] == 2_u8);
assert(result[2] == 3_u8);
assert(result[3] == 4_u8);
}

#[test]
fn test_u32_from_le_bytes() {
let bytes = [1_u8, 2_u8, 3_u8, 4_u8];
let result = u32::from_le_bytes(bytes);

assert(result == 67305985_u32);
}

#[test]
fn test_u32_to_be_bytes() {
let x: u32 = 67305985;
let result = x.to_be_bytes();

assert(result[0] == 4_u8);
assert(result[1] == 3_u8);
assert(result[2] == 2_u8);
assert(result[3] == 1_u8);
}

#[test]
fn test_u32_from_be_bytes() {
let bytes = [4_u8, 3_u8, 2_u8, 1_u8];
let result = u32::from_be_bytes(bytes);

assert(result == 67305985_u32);
}
46 changes: 0 additions & 46 deletions sway-lib-std/src/array_conversions/u64.sw
Original file line number Diff line number Diff line change
Expand Up @@ -257,49 +257,3 @@ impl u64 {
}
}
}

#[test]
fn test_u64_to_le_bytes() {
let x: u64 = 578437695752307201;
let result = x.to_le_bytes();

assert(result[0] == 1_u8);
assert(result[1] == 2_u8);
assert(result[2] == 3_u8);
assert(result[3] == 4_u8);
assert(result[4] == 5_u8);
assert(result[5] == 6_u8);
assert(result[6] == 7_u8);
assert(result[7] == 8_u8);
}

#[test]
fn test_u64_from_le_bytes() {
let bytes = [1_u8, 2_u8, 3_u8, 4_u8, 5_u8, 6_u8, 7_u8, 8_u8];
let result = u64::from_le_bytes(bytes);

assert(result == 578437695752307201);
}

#[test]
fn test_u64_to_be_bytes() {
let x: u64 = 578437695752307201;
let result = x.to_be_bytes();

assert(result[0] == 8_u8);
assert(result[1] == 7_u8);
assert(result[2] == 6_u8);
assert(result[3] == 5_u8);
assert(result[4] == 4_u8);
assert(result[5] == 3_u8);
assert(result[6] == 2_u8);
assert(result[7] == 1_u8);
}

#[test]
fn test_u64_from_be_bytes() {
let bytes = [8_u8, 7_u8, 6_u8, 5_u8, 4_u8, 3_u8, 2_u8, 1_u8];
let result = u64::from_be_bytes(bytes);

assert(result == 578437695752307201);
}
69 changes: 5 additions & 64 deletions sway-lib-std/src/asset_id.sw
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,11 @@ impl AssetId {

/// Creates a new AssetId with the default SubId for the current contract.
///
/// # Additional Information
///
/// **WARNING** If called in an external context, this will **not** return a correct AssetId.
/// If called externally, will actually use the Transaction Id as a the ContractId.
///
/// # Returns
///
/// * [AssetId] - The AssetId of the asset. Computed by hashing the ContractId and the default SubId.
Expand Down Expand Up @@ -240,67 +245,3 @@ impl From<AssetId> for b256 {
id.bits()
}
}

#[test()]
fn test_hasher_sha256_asset_id() {
use ::assert::assert;
let mut hasher = Hasher::new();
AssetId::from(0x0000000000000000000000000000000000000000000000000000000000000000)
.hash(hasher);
let s256 = hasher.sha256();
assert(s256 == 0x66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925);

let mut hasher = Hasher::new();
AssetId::from(0x0000000000000000000000000000000000000000000000000000000000000001)
.hash(hasher);
let s256 = hasher.sha256();
assert(s256 == 0xec4916dd28fc4c10d78e287ca5d9cc51ee1ae73cbfde08c6b37324cbfaac8bc5);
}

#[test()]
fn test_hasher_sha256_contract_id() {
use ::assert::assert;
let mut hasher = Hasher::new();
ContractId::from(0x0000000000000000000000000000000000000000000000000000000000000000)
.hash(hasher);
let s256 = hasher.sha256();
assert(s256 == 0x66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925);

let mut hasher = Hasher::new();
ContractId::from(0x0000000000000000000000000000000000000000000000000000000000000001)
.hash(hasher);
let s256 = hasher.sha256();
assert(s256 == 0xec4916dd28fc4c10d78e287ca5d9cc51ee1ae73cbfde08c6b37324cbfaac8bc5);
}

#[test]
fn test_asset_id_from_b256() {
use ::assert::assert;

let my_asset = AssetId::from(0x0000000000000000000000000000000000000000000000000000000000000001);
assert(
my_asset
.bits() == 0x0000000000000000000000000000000000000000000000000000000000000001,
);
}

#[test]
fn test_asset_id_into_b256() {
use ::assert::assert;
use ::convert::Into;

let asset = AssetId::from(0x0000000000000000000000000000000000000000000000000000000000000001);
let b256_data: b256 = asset.into();
assert(b256_data == 0x0000000000000000000000000000000000000000000000000000000000000001);
}

#[test]
fn test_asset_id_zero() {
use ::assert::assert;

let asset = AssetId::zero();
assert(asset.is_zero());

let other_assert = AssetId::from(0x0000000000000000000000000000000000000000000000000000000000000001);
assert(!other_assert.is_zero());
}
Loading

0 comments on commit 5e24673

Please sign in to comment.