Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
MicroProofs committed Jan 20, 2025
1 parent ea760bd commit 27e74a7
Show file tree
Hide file tree
Showing 2 changed files with 198 additions and 4 deletions.
4 changes: 2 additions & 2 deletions aiken.lock
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,5 @@ requirements = []
source = "github"

[etags]
"aiken-lang/fuzz@main" = [{ secs_since_epoch = 1737279884, nanos_since_epoch = 297901000 }, "e594326795accb687e9bfacd6a0553eb1d611ba23d5bba31b49ec7fe29445e3c"]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1737279883, nanos_since_epoch = 489311000 }, "9191378e1310dcd34d3f8a883f67fb6440c5535897e210e84ba90ec207b884fc"]
"aiken-lang/fuzz@main" = [{ secs_since_epoch = 1737341495, nanos_since_epoch = 950500000 }, "e594326795accb687e9bfacd6a0553eb1d611ba23d5bba31b49ec7fe29445e3c"]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1737341495, nanos_since_epoch = 295337000 }, "9191378e1310dcd34d3f8a883f67fb6440c5535897e210e84ba90ec207b884fc"]
198 changes: 196 additions & 2 deletions lib/constraint_utils.ak
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ use aiken/builtin
use aiken/cbor.{serialise}
use aiken/collection/dict.{to_pairs}
use aiken/primitive/bytearray.{concat}
use cardano/address.{Address, Inline, Script}
use cardano/assets.{Value, ada_policy_id, to_dict}
use cardano/transaction.{Input, Output}
use cardano/transaction.{InlineDatum, Input, NoDatum, Output, OutputReference}
use intention_types.{
InputConstraint, Nada, Options, OutputConstraint, SomeOne, SomeTwo,
}
Expand All @@ -23,6 +24,42 @@ pub fn select_field(field_selection_list: List<Data>, constr: Data) -> Data {
}
}

const test_thing = {
let thing_1 =
builtin.constr_data(2, [dataify("a"), dataify(1), dataify([2])])

let thing_2 =
builtin.constr_data(1, [dataify("b"), thing_1, dataify(["ab"])])

builtin.constr_data(5, [thing_2, dataify(1), thing_1])
}

const test_list = [dataify("a"), dataify(1), dataify([2])]

test select_field_1() {
select_field([dataify(0), dataify(1), dataify(2)], test_thing) == dataify([2])
}

test select_field_empty() {
select_field([], test_thing) == test_thing
}

test select_field_3() {
select_field([dataify(1)], test_thing) == dataify(1)
}

test select_field_4() {
select_field([dataify(2), dataify(0)], test_thing) == dataify("a")
}

test select_field_out_of_range() fail {
select_field([dataify(2), dataify(3)], test_thing) == dataify("a")
}

test select_field_cant_do_list() fail {
select_field([dataify(1)], test_list) == dataify(1)
}

pub fn expect_options_data_tuple_bytearray(
options: Data,
) -> Options<Data, (ByteArray, ByteArray)> {
Expand Down Expand Up @@ -50,6 +87,43 @@ pub fn check_val(vals: List<Data>, value: Value) -> Bool {
}
}

test check_val_1() {
let value = assets.from_asset("ab", "cd", 50) |> assets.add("", "", 1000000)

check_val([dataify(("ab", "cd", 50))], value)
}

test check_val_2() {
let value = assets.from_asset("ab", "cd", 50) |> assets.add("", "", 1000000)

check_val([dataify(("", "", 1000000))], value)
}

test check_val_3() {
let value =
assets.from_asset("ab", "cd", 50)
|> assets.add("", "", 1000000)
|> assets.add("de", "fg", 1)

check_val(
[
dataify(("", "", 1000000)),
dataify(("ab", "cd", 50)),
dataify(("de", "fg", 1)),
],
value,
)
}

test check_val_4() fail {
let value =
assets.from_asset("ab", "cd", 50)
|> assets.add("", "", 1000000)
|> assets.add("de", "fg", 1)

check_val([dataify(("", "", 2000000))], value)
}

pub fn handle_inp_constraint(
inputs: List<Input>,
con: Data<InputConstraint>,
Expand Down Expand Up @@ -102,12 +176,132 @@ pub fn handle_inp_constraint(
apply_constraint_to_inputs(datum_field, inputs, runnable)
}

test handle_inp_constraint_1() {
let value =
assets.from_asset("ab", "cd", 50)
|> assets.add("", "", 1000000)
|> assets.add("de", "fg", 1)

let con =
InputConstraint {
address: SomeOne(Address(Script("thing"), None)),
value: [("ab", "cd", 50)],
datum_field: [],
in_ref: None,
}

let input =
Input(
OutputReference("abcd", 1),
Output(Address(Script("thing"), None), value, NoDatum, None),
)

handle_inp_constraint([input], con) == dataify(NoDatum)
}

test handle_inp_constraint_2() fail {
let value =
assets.from_asset("ab", "cd", 50)
|> assets.add("", "", 1000000)
|> assets.add("de", "fg", 1)

let con =
InputConstraint {
address: SomeOne(Address(Script("thing"), None)),
value: [("ab", "cd", 50)],
datum_field: [],
in_ref: None,
}

let input =
Input(
OutputReference("abcd", 1),
Output(
Address(Script("thing"), Some(Inline(Script("other")))),
value,
NoDatum,
None,
),
)

handle_inp_constraint([input], con) == dataify(NoDatum)
}

test handle_inp_constraint_3() fail {
let value =
assets.from_asset("ab", "cd", 50)
|> assets.add("", "", 1000000)
|> assets.add("de", "fg", 1)

let con =
InputConstraint {
address: SomeOne(Address(Script("thing"), None)),
value: [("ab", "cd", 50)],
datum_field: [],
in_ref: None,
}

let input =
Input(
OutputReference("abcd", 1),
Output(Address(Script("thing"), None), value, NoDatum, None),
)

handle_inp_constraint([input], con) == dataify(InlineDatum("1"))
}

test handle_inp_constraint_4() {
let value =
assets.from_asset("ab", "cd", 50)
|> assets.add("", "", 1000000)
|> assets.add("de", "fg", 1)

let con =
InputConstraint {
address: SomeOne(Address(Script("thing"), None)),
value: [("ab", "cd", 50)],
datum_field: [],
in_ref: Some(OutputReference("abcd", 1)),
}

let input =
Input(
OutputReference("abcd", 1),
Output(Address(Script("thing"), None), value, NoDatum, None),
)

handle_inp_constraint([input], con) == dataify(NoDatum)
}

test handle_inp_constraint_5() {
let value =
assets.from_asset("ab", "cd", 50)
|> assets.add("", "", 1000000)
|> assets.add("de", "fg", 1)

let con =
InputConstraint {
address: SomeOne(Address(Script("thing"), None)),
value: [("ab", "cd", 50), ("de", "fg", 2)],
datum_field: [],
in_ref: Some(OutputReference("abcd", 1)),
}

let input =
Input(
OutputReference("abcd", 1),
Output(Address(Script("thing"), None), value, NoDatum, None),
)

handle_inp_constraint([input], con) == dataify(NoDatum)
}

fn apply_constraint_to_inputs(datum_field, inputs: List<Input>, runnable) {
expect [x, ..rest] = inputs

if runnable(x) {
if datum_field == dataify([]) {
dataify(None)
dataify(x.output.datum)
} else {
datum_field
|> builtin.un_list_data
Expand Down

0 comments on commit 27e74a7

Please sign in to comment.