1%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*-
2%% ex: ts=4 sw=4 et
3-module(rebar_dia_tests).
4
5-compile([export_all]).
6
7-include_lib("eunit/include/eunit.hrl").
8
9-define(REBAR_SCRIPT, "../rebar").
10
11-define(TMP_DIR, "dia_project/").
12
13dia_test_() ->
14    case supported_otp_version() of
15        true ->
16            {"Test the dia compiler",
17             setup, fun() -> setup_project(), rebar("compile") end,
18             fun teardown/1,
19             fun(RebarOut) ->
20                 [{"Check ebin is created",
21                   ?_assert(filelib:is_dir("ebin") =:= true)},
22
23                  {"Check include is created",
24                   ?_assert(filelib:is_dir("include") =:= true)},
25
26                  {"Check dia/a.dia is compiled",
27                   ?_assert(string:str(RebarOut, "Compiled dia/a.dia") /= 0)},
28
29                  {"Check dia/b.dia is compiled",
30                   ?_assert(string:str(RebarOut, "Compiled dia/b.dia") /= 0)}
31                 ]
32             end};
33        false -> {setup, fun() -> ok end, []}
34    end.
35
36
37%% ====================================================================
38%% Setup and Teardown
39%% ====================================================================
40
41-define(myapp_dia_a,
42        ["@id     0\n",
43         "@name   a\n",
44         "@vendor 1 ABC\n",
45         "@avp_types\n",
46         "   IMSI 1 UTF8String V"
47        ]).
48
49-define(myapp_dia_b,
50        ["@id     2\n",
51         "@name   b\n",
52         "@vendor 2 ABC\n",
53         "@inherits a\n",
54         "@avp_types\n",
55         "   IMEIV 900 OctetString MV"
56        ]).
57
58-define(myapp_rebarconfig,
59        ["{dia_first_files, [\"dia/a.dia\"]}.\n",
60         "{dia_opts, []}.\n"
61        ]).
62
63supported_otp_version() ->
64    Min = rebar_require_vsn:version_tuple(keep_going, "15", "configured"),
65    Otp = rebar_require_vsn:version_tuple(keep_going,
66                                          erlang:system_info(otp_release),
67                                          "OTP Release"),
68    Otp >= Min.
69
70
71setup_environment() ->
72    ok = file:make_dir(?TMP_DIR),
73    prepare_rebar_script(),
74    ok = file:set_cwd(?TMP_DIR).
75
76prepare_project() ->
77    setup_environment(),
78    rebar("create-app appid=myapp").
79
80
81setup_project() ->
82    prepare_project(),
83    ok = file:make_dir("dia"),
84    ok = file:write_file("dia/a.dia", ?myapp_dia_a),
85    ok = file:write_file("dia/b.dia", ?myapp_dia_b),
86    ok = file:write_file("rebar.config", ?myapp_rebarconfig).
87
88
89teardown(_) ->
90    ok = file:set_cwd(".."),
91    ok = remove_tmp_dir().
92
93remove_tmp_dir() ->
94    ok = rebar_file_utils:rm_rf(?TMP_DIR).
95
96%% ====================================================================
97%% Helper Functions
98%% ====================================================================
99
100prepare_rebar_script() ->
101    Rebar = ?TMP_DIR ++ "rebar",
102    {ok, _} = file:copy(?REBAR_SCRIPT, Rebar),
103    case os:type() of
104        {unix, _} ->
105            [] = os:cmd("chmod u+x " ++ Rebar);
106        {win32, _} ->
107            {ok, _} = file:copy(?REBAR_SCRIPT ++ ".cmd",
108                                ?TMP_DIR ++ "rebar.cmd")
109    end.
110
111rebar() ->
112    rebar([]).
113
114rebar(Args) when is_list(Args) ->
115    Out = os:cmd(filename:nativename("./rebar") ++ " " ++ Args),
116    Out.
117