Продолжаем тему предыдущего поста и поговорим вообще о вариантах сравнения ожидаемых результатов исполнения функции в тестах с полученными.
Тогда мы узнали о первой функции-помощнике - asserteq(), которая принимает два значения (ожидаемое и полученное) и сравнивает их на равенство. Другими словами, в данном случае, чтобы тест прошел они должны быть равны друг другу.
При этом есть еще множество других сравнений. Например, создадим новый тест, в котором установим переменную number = 150.
function test_setNumber() public {
counter.setNumber(150);
}
Теперь с помощью последующих команды мы можем проверить, что:assertGt(counter.number(), 140); //проверка, если "а" больше "б";
assertGe(counter.number(), 150); // проверка, если "а" больше или равно "б";
assertLt(counter.number(), 170); // проверка, если "а" меньше "б";
assertLe(counter.number(), 150); // проверка, если "а" меньше или равно "б";
Есть еще две более сложные команды:
assertApproxEqAbs();
assertApproxEqRel();
Первая проверяет, что значение "а" примерно равно "б", но в пределах определенной дельты. Другими словами, "а" не должно превышать "б+с", например:
assertApproxEqAbs(counter.number(), 200, 200);Вторая же команда делает примерно тоже, но в процентном соотношении, где 100% = 1е18, и пример может выглядеть так:
assertApproxEqRel(counter.number(), 150, 0.4e18);Эти две команды могут быть полезны при работе с DeFi протоколами, где часто идет работа с дельтами значений и ценами на токены.
Кроме того, вы также можете проверять еще несколько параметров и не только числовых:
1. assertTrue(); - проверка, что результат будет равен true
2. assertFalse(); - проверка, что результат будет равен false
3. assertEqDecimal(); - проверка, на равенство decimals
4. assertEq32(); - проверка, что результат будет равен bytes32
5. assertEq0(); - проверка, что результат будет равен bytes32
Хоть они используют реже, чем остальные, все равно их также можно встретить в крупных проектах.
#foundry #lesson12