/*
 * 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.
 */

/**
@mainpage

- @ref zunitc - Simple test framework

@section tools_overview Overview

The tools area currently consists of one sub-project (@ref zunitc) that is
refined from the prior single weston/tests source folder.

@subsection tools_overview_old Old Code Organization

The original 'tests' folder contained basic weston testing with an
integrated test runner framework. Over time things progressed to the
stage where splitting apart into discrete layers was warranted.

@dotfile tools_arch_old.gv "Original test code organization"

@subsection tools_overview_new New Code Organization

The test code that is not weston-specific gets split out to a separate
folder and/or folders.

@dotfile tools_arch_new.gv "Refactored test code organization"

*/
