%% Copyright (c) 2008-2009 Nick Gerakines %% %% Permission is hereby granted, free of charge, to any person %% obtaining a copy of this software and associated documentation %% files (the "Software"), to deal in the Software without %% restriction, including without limitation the rights to use, %% copy, modify, merge, publish, distribute, sublicense, and/or sell %% copies of the Software, and to permit persons to whom the %% Software is furnished to do so, subject to the following %% conditions: %% %% The above copyright notice and this permission notice shall be %% included in all copies or substantial portions of the Software. %% %% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, %% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES %% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND %% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT %% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, %% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING %% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR %% OTHER DEALINGS IN THE SOFTWARE. %% %% @reference http://testanything.org/wiki/index.php/Main_Page %% @reference http://en.wikipedia.org/wiki/Test_Anything_Protocol %% @doc Provide test functionality modules -module(etap_can). -export([ loaded_ok/2, can_ok/2, can_ok/3, has_attrib/2, is_attrib/3, is_behaviour/2 ]). %% @spec loaded_ok(atom(), string()) -> true | false %% @doc Assert that a module has been loaded successfully. loaded_ok(M, Desc) when is_atom(M) -> etap:fun_is(fun({module, _}) -> true; (_) -> false end, code:load_file(M), Desc). %% @spec can_ok(atom(), atom()) -> true | false %% @doc Assert that a module exports a given function. can_ok(M, F) when is_atom(M), is_atom(F) -> Matches = [X || {X, _} <- M:module_info(exports), X == F], etap:ok(Matches > 0, lists:concat([M, " can ", F])). %% @spec can_ok(atom(), atom(), integer()) -> true | false %% @doc Assert that a module exports a given function with a given arity. can_ok(M, F, A) when is_atom(M); is_atom(F), is_number(A) -> Matches = [X || X <- M:module_info(exports), X == {F, A}], etap:ok(Matches > 0, lists:concat([M, " can ", F, "/", A])). %% @spec has_attrib(M, A) -> true | false %% M = atom() %% A = atom() %% @doc Asserts that a module has a given attribute. has_attrib(M, A) when is_atom(M), is_atom(A) -> etap:isnt( proplists:get_value(A, M:module_info(attributes), 'asdlkjasdlkads'), 'asdlkjasdlkads', lists:concat([M, " has attribute ", A]) ). %% @spec has_attrib(M, A. V) -> true | false %% M = atom() %% A = atom() %% V = any() %% @doc Asserts that a module has a given attribute with a given value. is_attrib(M, A, V) when is_atom(M) andalso is_atom(A) -> etap:is( proplists:get_value(A, M:module_info(attributes)), [V], lists:concat([M, "'s ", A, " is ", V]) ). %% @spec is_behavior(M, B) -> true | false %% M = atom() %% B = atom() %% @doc Asserts that a given module has a specific behavior. is_behaviour(M, B) when is_atom(M) andalso is_atom(B) -> is_attrib(M, behaviour, B).