mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 03:27:44 +00:00
expr: support arbitrary precision integers (#2271)
* expr: support arbitrary precision integers Instead of i64s we now use BigInts for integer operations. This means that no result or input can be out of range. The representation of integer flags was changed from i64 to u8 to make their intention clearer. * expr: allow big numbers as arguments as well Also adds some tests * expr: use num-traits to check bigints for 0 and 1 * expr: remove obsolete refs match ergonomics made these avoidable. * formatting Co-authored-by: Sylvestre Ledru <sylvestre@debian.org>
This commit is contained in:
parent
6e1a68ce9a
commit
d821719c67
5 changed files with 128 additions and 84 deletions
|
@ -2,55 +2,95 @@ use crate::common::util::*;
|
|||
|
||||
#[test]
|
||||
fn test_simple_arithmetic() {
|
||||
new_ucmd!().args(&["1", "+", "1"]).run().stdout_is("2\n");
|
||||
new_ucmd!()
|
||||
.args(&["1", "+", "1"])
|
||||
.succeeds()
|
||||
.stdout_only("2\n");
|
||||
|
||||
new_ucmd!().args(&["1", "-", "1"]).run().stdout_is("0\n");
|
||||
new_ucmd!()
|
||||
.args(&["1", "-", "1"])
|
||||
.fails()
|
||||
.status_code(1)
|
||||
.stdout_only("0\n");
|
||||
|
||||
new_ucmd!().args(&["3", "*", "2"]).run().stdout_is("6\n");
|
||||
new_ucmd!()
|
||||
.args(&["3", "*", "2"])
|
||||
.succeeds()
|
||||
.stdout_only("6\n");
|
||||
|
||||
new_ucmd!().args(&["4", "/", "2"]).run().stdout_is("2\n");
|
||||
new_ucmd!()
|
||||
.args(&["4", "/", "2"])
|
||||
.succeeds()
|
||||
.stdout_only("2\n");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_complex_arithmetic() {
|
||||
let run = new_ucmd!()
|
||||
new_ucmd!()
|
||||
.args(&["9223372036854775807", "+", "9223372036854775807"])
|
||||
.run();
|
||||
run.stdout_is("");
|
||||
run.stderr_is("expr: +: Numerical result out of range");
|
||||
.succeeds()
|
||||
.stdout_only("18446744073709551614\n");
|
||||
|
||||
let run = new_ucmd!().args(&["9", "/", "0"]).run();
|
||||
run.stdout_is("");
|
||||
run.stderr_is("expr: division by zero");
|
||||
new_ucmd!()
|
||||
.args(&[
|
||||
"92233720368547758076549841651981984981498415651",
|
||||
"%",
|
||||
"922337203685",
|
||||
])
|
||||
.succeeds()
|
||||
.stdout_only("533691697086\n");
|
||||
|
||||
new_ucmd!()
|
||||
.args(&[
|
||||
"92233720368547758076549841651981984981498415651",
|
||||
"*",
|
||||
"922337203685",
|
||||
])
|
||||
.succeeds()
|
||||
.stdout_only("85070591730190566808700855121818604965830915152801178873935\n");
|
||||
|
||||
new_ucmd!()
|
||||
.args(&[
|
||||
"92233720368547758076549841651981984981498415651",
|
||||
"-",
|
||||
"922337203685",
|
||||
])
|
||||
.succeeds()
|
||||
.stdout_only("92233720368547758076549841651981984059161211966\n");
|
||||
|
||||
new_ucmd!()
|
||||
.args(&["9", "/", "0"])
|
||||
.fails()
|
||||
.stderr_only("expr: division by zero\n");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parenthesis() {
|
||||
new_ucmd!()
|
||||
.args(&["(", "1", "+", "1", ")", "*", "2"])
|
||||
.run()
|
||||
.stdout_is("4\n");
|
||||
.succeeds()
|
||||
.stdout_only("4\n");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_or() {
|
||||
new_ucmd!()
|
||||
.args(&["0", "|", "foo"])
|
||||
.run()
|
||||
.stdout_is("foo\n");
|
||||
.succeeds()
|
||||
.stdout_only("foo\n");
|
||||
|
||||
new_ucmd!()
|
||||
.args(&["foo", "|", "bar"])
|
||||
.run()
|
||||
.stdout_is("foo\n");
|
||||
.succeeds()
|
||||
.stdout_only("foo\n");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_and() {
|
||||
new_ucmd!()
|
||||
.args(&["foo", "&", "1"])
|
||||
.run()
|
||||
.stdout_is("foo\n");
|
||||
.succeeds()
|
||||
.stdout_only("foo\n");
|
||||
|
||||
new_ucmd!().args(&["", "&", "1"]).run().stdout_is("0\n");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue