Files
mercury/tests/general/base_string_to_integer.m
Peter Wang c89017a096 Add integer.to_base_string.
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.
2015-02-17 12:14:16 +11:00

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)
).