Mercurial > pub > dyncall > bindings
diff erlang/erldc/test/call_SUITE.erl @ 0:0cfcc391201f
initial from svn dyncall-1745
author | Daniel Adler |
---|---|
date | Thu, 19 Mar 2015 22:26:28 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/erlang/erldc/test/call_SUITE.erl Thu Mar 19 22:26:28 2015 +0100 @@ -0,0 +1,193 @@ +%% Copyright (c) 2014 Erik Mackdanz <erikmack@gmail.com> + +%% Permission to use, copy, modify, and distribute this software for any +%% purpose with or without fee is hereby granted, provided that the above +%% copyright notice and this permission notice appear in all copies. + +%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +-module(call_SUITE). +-compile(export_all). + +-define(VMSZ, 1024). + +all() -> + [ + ret_double_arg_double, + arg_double_bad_vm, + arg_double_bad_vm_2, + arg_double_bad_vm_3, + arg_double_bad_arg, + call_double_bad_vm, + call_double_bad_sym, + + ret_float_arg_float, + + ret_int, + arg_int, + + ret_char_arg_char, + ret_bool_arg_bool, + ret_bool_arg_bool_2, + bad_bool_arg, + ret_short_arg_short, + ret_long_arg_long, + ret_longlong_arg_longlong, + + ret_ptr_arg_int__ret_void_arg_ptr, + ret_string_arg_string + ]. + +%% Tests on sqrt + +ret_double_arg_double(_) -> + {ok,Libm} = dyncall:load_library("libm"), + {ok,Sqrt} = dyncall:find_symbol(Libm, "sqrt"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_double(CallVm,49.0), + {ok,7.0} = dyncall:call_double(CallVm,Sqrt). + +arg_double_bad_vm(_) -> + {error,invalid_vm} = dyncall:arg_double(1000,49.0). + +arg_double_bad_vm_2(_) -> + {error,invalid_vm} = dyncall:arg_double("Not an int",49.0). + +arg_double_bad_vm_3(_) -> + {error,invalid_vm} = dyncall:arg_double(-4,49.0). + +arg_double_bad_arg(_) -> + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + {error,invalid_arg} = dyncall:arg_double(CallVm,"Not a double"). + +call_double_bad_vm(_) -> + {ok,Libm} = dyncall:load_library("libm"), + {ok,Sqrt} = dyncall:find_symbol(Libm, "sqrt"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_double(CallVm,49.0), + {error,invalid_vm} = dyncall:call_double(12,Sqrt). %% assuming 12 is bad after preceding tests + +call_double_bad_sym(_) -> + {ok,Libm} = dyncall:load_library("libm"), + {ok,_Sqrt} = dyncall:find_symbol(Libm, "sqrt"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_double(CallVm,49.0), + {error,invalid_arg} = dyncall:call_double(CallVm,12). %% assuming 12 is bad after preceding tests + + +%% Tests on sqrtf + +ret_float_arg_float(_) -> + {ok,Libm} = dyncall:load_library("libm"), + {ok,Sqrt} = dyncall:find_symbol(Libm, "sqrtf"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_float(CallVm,49.0), + {ok,7.0} = dyncall:call_float(CallVm,Sqrt). + +%% Tests on ilogb +ret_int(_) -> + {ok,Libm} = dyncall:load_library("libm"), + {ok,Exp} = dyncall:find_symbol(Libm, "ilogb"), + {ok,CallVm} = dyncall:new_call_vm(4096), + ok = dyncall:arg_double(CallVm,1024.0), + {ok,10} = dyncall:call_int(CallVm,Exp). + +%% Tests on ldexp +arg_int(_) -> + {ok,Libm} = dyncall:load_library("libm"), + {ok,Exp} = dyncall:find_symbol(Libm, "ldexp"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_double(CallVm,3.0), + ok = dyncall:arg_int(CallVm,2), + {ok,12.0} = dyncall:call_double(CallVm,Exp). + +%% Tests on get_next_char +ret_char_arg_char(_) -> + {ok,Libm} = dyncall:load_library("erldc_testtargets"), + {ok,Sym} = dyncall:find_symbol(Libm, "get_next_char"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_char(CallVm,$e), + {ok,$f} = dyncall:call_char(CallVm,Sym). + +%% Tests on is_false +ret_bool_arg_bool(_) -> + {ok,Libm} = dyncall:load_library("erldc_testtargets"), + {ok,Sym} = dyncall:find_symbol(Libm, "is_false"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_bool(CallVm,true), + {ok,false} = dyncall:call_bool(CallVm,Sym). + +ret_bool_arg_bool_2(_) -> + {ok,Libm} = dyncall:load_library("erldc_testtargets"), + {ok,Sym} = dyncall:find_symbol(Libm, "is_false"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_bool(CallVm,false), + {ok,true} = dyncall:call_bool(CallVm,Sym). + +bad_bool_arg(_) -> + {ok,Libm} = dyncall:load_library("erldc_testtargets"), + {ok,_Sym} = dyncall:find_symbol(Libm, "is_false"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + {error,invalid_arg} = dyncall:arg_bool(CallVm,foobar). + +%% Tests on times_three +ret_short_arg_short(_) -> + {ok,Libm} = dyncall:load_library("erldc_testtargets"), + {ok,Sym} = dyncall:find_symbol(Libm, "times_three"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_short(CallVm,7), + {ok,21} = dyncall:call_short(CallVm,Sym). + +%% Tests on add_nineteen +ret_long_arg_long(_) -> + {ok,Libm} = dyncall:load_library("erldc_testtargets"), + {ok,Sym} = dyncall:find_symbol(Libm, "add_nineteen"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_long(CallVm,12), + {ok,31} = dyncall:call_long(CallVm,Sym). + +%% Tests on subtract_four +ret_longlong_arg_longlong(_) -> + {ok,Libm} = dyncall:load_library("erldc_testtargets"), + {ok,Sym} = dyncall:find_symbol(Libm, "subtract_four"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_longlong(CallVm,15), + {ok,11} = dyncall:call_longlong(CallVm,Sym). + +%% Tests on coolmalloc/coolfree +ret_ptr_arg_int__ret_void_arg_ptr(_) -> + {ok,Lib} = dyncall:load_library("erldc_testtargets"), + {ok,Sym} = dyncall:find_symbol(Lib, "coolmalloc"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_int(CallVm,100), + {ok,Ptr} = dyncall:call_ptr(CallVm,Sym), + + %% Comes out as <<>> (opaque) + %% io:format("Pointer in erl is ~p~n",[Ptr]), + + {ok,Sym2} = dyncall:find_symbol(Lib, "coolsetstr"), + {ok,CallVm2} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_ptr(CallVm2,Ptr), + ok = dyncall:arg_string(CallVm2,"Barbaz"), + ok = dyncall:call_void(CallVm2,Sym2), + + {ok,Sym3} = dyncall:find_symbol(Lib, "coolfree"), + {ok,CallVm3} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_ptr(CallVm3,Ptr), + ok = dyncall:call_void(CallVm3,Sym3). + +%% Tests on interested_reply +ret_string_arg_string(_) -> + {ok,Libm} = dyncall:load_library("erldc_testtargets"), + {ok,Sym} = dyncall:find_symbol(Libm, "interested_reply"), + {ok,CallVm} = dyncall:new_call_vm(?VMSZ), + ok = dyncall:arg_string(CallVm,"Georg"), + {ok,"Really, Georg? My name is Erik."} = dyncall:call_string(CallVm,Sym). + +