mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-15 17:33:38 +00:00
library/integer.m: Add to_base_string/2. tests/general/base_string_to_integer.exp: tests/general/base_string_to_integer.m: Extend test case. NEWS: Announce addition.
124 lines
3.2 KiB
Mathematica
124 lines
3.2 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
|
|
% Test converting strings to arbitrary precision integers.
|
|
|
|
:- module base_string_to_integer.
|
|
:- interface.
|
|
|
|
:- import_module io.
|
|
|
|
:- pred main(io::di, io::uo) is det.
|
|
|
|
:- implementation.
|
|
:- import_module integer.
|
|
:- import_module list.
|
|
:- import_module require.
|
|
:- import_module string.
|
|
|
|
main(!IO) :-
|
|
Base2 = [
|
|
"0",
|
|
"1",
|
|
"01",
|
|
"-000001",
|
|
"11",
|
|
"111",
|
|
"11111",
|
|
"101010",
|
|
"10000000000000000000000000000000",
|
|
"1000000000000000000000000000000000000000000000000000000000000000",
|
|
"10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
],
|
|
check_base_valid(2, Base2, !IO),
|
|
Base8 = [
|
|
"0",
|
|
"1",
|
|
"-1",
|
|
"10",
|
|
"-10",
|
|
"76543210",
|
|
"-76543210",
|
|
"7777777777777777777777777"
|
|
],
|
|
check_base_valid(8, Base8, !IO),
|
|
Base10 = [
|
|
"0",
|
|
"1",
|
|
"10",
|
|
"11",
|
|
"1234567890",
|
|
"-1",
|
|
"-10",
|
|
"-1234567890",
|
|
"1234567891234567891234567890",
|
|
"-1234567891234567891234567890"
|
|
],
|
|
check_base_valid(10, Base10, !IO),
|
|
Base16 = [
|
|
"0",
|
|
"1",
|
|
"-1",
|
|
"10",
|
|
"A",
|
|
"-A",
|
|
"a",
|
|
"-a",
|
|
"F",
|
|
"-F",
|
|
"fedcba0987654321",
|
|
"-fedcba0987654321",
|
|
"fffffffffffffffffffffffffffffffffff",
|
|
"-fffffffffffffffffffffffffffffffffff"
|
|
],
|
|
check_base_valid(16, Base16, !IO),
|
|
Base36 = [
|
|
"0",
|
|
"1",
|
|
"-1",
|
|
"10",
|
|
"A",
|
|
"-A",
|
|
"a",
|
|
"-a",
|
|
"Z",
|
|
"-Z",
|
|
"zyxwvutsrqponmlkjihgfedcba0987654321",
|
|
"-zyxwvutsrqponmlkjihgfedcba0987654321",
|
|
"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
|
|
"-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
|
|
],
|
|
check_base_valid(36, Base36, !IO),
|
|
InvalidBase2 = ["3", "4", "5", "6", "a", "A", "z", "13"],
|
|
check_base_invalid(2, InvalidBase2, !IO),
|
|
InvalidBase10 = ["abc", "-123a", "ZZZ"],
|
|
check_base_invalid(10, InvalidBase10, !IO).
|
|
|
|
:- pred check_base_valid(int::in, list(string)::in, io::di, io::uo) is det.
|
|
|
|
check_base_valid(_, [], !IO).
|
|
check_base_valid(Base, [String | Strings], !IO) :-
|
|
Num = integer.det_from_base_string(Base, String),
|
|
NumStr = integer.to_string(Num),
|
|
io.format("%s (base %d) = %s\n", [s(String), i(Base), s(NumStr)], !IO),
|
|
|
|
StringB = integer.to_base_string(Num, Base),
|
|
io.format("to_base_string produces \"%s\"\n", [s(StringB)], !IO),
|
|
io.nl(!IO),
|
|
|
|
check_base_valid(Base, Strings, !IO).
|
|
|
|
:- pred check_base_invalid(int::in, list(string)::in, io::di, io::uo) is det.
|
|
|
|
check_base_invalid(_, [], !IO).
|
|
check_base_invalid(Base, [String | Strings], !IO) :-
|
|
( integer.from_base_string(Base, String, Num) ->
|
|
NumStr = integer.to_string(Num),
|
|
string.format("ERROR: %s (base %d) = %s\n",
|
|
[s(String), i(Base), s(NumStr)], ErrorMsg),
|
|
error(ErrorMsg)
|
|
;
|
|
check_base_invalid(Base, Strings, !IO)
|
|
).
|