/*
 * Copyright © 2015 Samsung Electronics Co., Ltd
 *
 * 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 (including the
 * next paragraph) 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.
 */

digraph toolarch_new {
    rankdir = "TB";

    node[shape=record]

    subgraph cluster_0 {
        label = "./tests";

        keyboard_test_c [label = "{keyboard-test.c|tests\l}"]
        text_test_c [label = "{text-test.c|tests\l}"]
        vertex_clip_test_c [label = "{vertex-clip-test.c|tests\l}"]

	spacer [shape = point, style = invis]

        weston_test_client_helper [label = "{weston-test-client-helper.h/.c|Weston test protocol\l}"]

        weston_test_c [label = "{weston-test.c|Extension protocol\nimplementation}"]
    }

    subgraph cluster_1 {
        label = "./tools/waycheck";

	waycheck [label = "{waycheck.c| \n \n }"]
    }

    subgraph cluster_2 {
        label = "./tools/wayland_fixtures";

	wtst_fixtures [label = "{wtst_fixtures.h/c|Wayland tracking structs\lWayland callbacks\l}"]
    }

    subgraph cluster_3 {
        label = "./tools/zunitc";

	zunitc [label = "{zunitc|Test definition macros\lTest running functions\lTest reporting functions\lTest run lifecycle\l}"]
    }

    keyboard_test_c -> weston_test_client_helper
    keyboard_test_c -> wtst_fixtures
    keyboard_test_c -> zunitc
    vertex_clip_test_c -> zunitc
    text_test_c -> weston_test_client_helper
    text_test_c -> wtst_fixtures
    text_test_c -> zunitc

    waycheck -> wtst_fixtures
    waycheck -> zunitc

    wtst_fixtures -> zunitc

    edge [style = dashed, arrowhead = open]
    weston_test_client_helper -> weston_test_c

    edge [style = invis]
    weston_test_client_helper -> zunitc

    text_test_c -> spacer
    keyboard_test_c -> spacer
    spacer -> weston_test_client_helper
}
