diff --git a/src/gmser_id.erl b/src/gmser_id.erl index 1056ef1..7655ec4 100644 --- a/src/gmser_id.erl +++ b/src/gmser_id.erl @@ -14,6 +14,8 @@ , specialize/1 , specialize/2 , specialize_type/1 + , is_account/1 + , account_pubkey/1 , to_map/1 , is_id/1 ]). @@ -104,6 +106,20 @@ specialize_type(#id{tag = {Tag, _}}) when ?IS_TAG(Tag) -> specialize_type(#id{tag = Tag}) when ?IS_TAG(Tag) -> Tag. +-spec is_account(id() | term()) -> boolean(). +is_account(#id{tag = account}) -> + true; +is_account(#id{tag = {account, _}}) -> + true; +is_account(_) -> + false. + +-spec account_pubkey(id()) -> val(). +account_pubkey(#id{tag = account, val = Val}) when ?IS_VAL(Val) -> + Val; +account_pubkey(#id{tag = {account, _}, val = Val}) when ?IS_VAL(Val) -> + Val. + -spec to_map(id()) -> id_map(). to_map(#id{tag = {Tag, SubType}, val = Val}) when ?IS_TAG(Tag) -> #{ type => Tag diff --git a/test/gmser_id_tests.erl b/test/gmser_id_tests.erl new file mode 100644 index 0000000..6ac5aa8 --- /dev/null +++ b/test/gmser_id_tests.erl @@ -0,0 +1,44 @@ +-module(gmser_id_tests). + +-include_lib("eunit/include/eunit.hrl"). + +-define(PUBKEY, <<12345:32/unit:8>>). + +is_account_test() -> + {"is_account recognizes standard and extended account ids", + fun() -> + ?assert(gmser_id:is_account(gmser_id:create(account, ?PUBKEY))), + ?assert(gmser_id:is_account(gmser_id:create({account, 0}, ?PUBKEY))), + ?assert(gmser_id:is_account(gmser_id:create({account, 5}, ?PUBKEY))), + ?assertNot(gmser_id:is_account(gmser_id:create(contract, ?PUBKEY))), + ?assertNot(gmser_id:is_account(not_an_id)) + end}. + +account_pubkey_test() -> + {"account_pubkey returns the 32-byte account hash", + fun() -> + ?assertEqual(?PUBKEY, + gmser_id:account_pubkey(gmser_id:create(account, ?PUBKEY))), + ?assertEqual(?PUBKEY, + gmser_id:account_pubkey(gmser_id:create({account, 3}, ?PUBKEY))), + ?assertEqual(?PUBKEY, + gmser_id:account_pubkey(gmser_id:create({account, 6}, ?PUBKEY))) + end}. + +account_pubkey_matches_specialize_test() -> + {"account_pubkey agrees with specialize/2 for account ids", + fun() -> + Id = gmser_id:create({account, 2}, ?PUBKEY), + ?assertEqual(gmser_id:specialize(Id, account), + gmser_id:account_pubkey(Id)) + end}. + +extended_account_roundtrip_test() -> + {"extended account ids round-trip through encode/decode", + fun() -> + Id = gmser_id:create({account, 4}, ?PUBKEY), + ?assert(gmser_id:is_account(Id)), + Id1 = gmser_id:decode(gmser_id:encode(Id)), + ?assertEqual(?PUBKEY, gmser_id:account_pubkey(Id1)), + ?assertEqual(account, gmser_id:specialize_type(Id1)) + end}. \ No newline at end of file