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