/*

 * Copyright (c) 2012-2017 The Khronos Group Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "test_engine/test.h"
#include <VX/vx.h>
#include <VX/vxu.h>

TESTCASE(Graph, CT_VXContext, ct_setup_vx_context, 0)

TEST(Graph, testTwoNodes)
{
    vx_context context = context_->vx_context_;
    vx_image src_image = 0, interm_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0;

    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst_image), VX_TYPE_NODE);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseNode(&node2));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&interm_image));
    VX_CALL(vxReleaseImage(&src_image));

    ASSERT(node1 == 0); ASSERT(node2 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
}

TEST(Graph, testVirtualImage)
{
    vx_context context = context_->vx_context_;
    vx_image src_image = 0, interm_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0;

    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
    ASSERT_VX_OBJECT(interm_image = vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst_image), VX_TYPE_NODE);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseNode(&node2));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&interm_image));
    VX_CALL(vxReleaseImage(&src_image));

    ASSERT(node1 == 0); ASSERT(node2 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
}

#ifndef dimof
#  define dimof(arr) (sizeof(arr)/sizeof((arr)[0]))
#endif

// example from specification wrapped into asserts
static void testCornersGraphFactory(vx_context context, vx_graph* graph_out)
{
    vx_uint32 i;
    vx_float32 strength_thresh = 10000.0f;
    vx_float32 r = 1.5f;
    vx_float32 sensitivity = 0.14f;
    vx_int32 window_size = 3;
    vx_int32 block_size = 3;
    vx_graph graph = 0;
    vx_enum channel = VX_CHANNEL_Y;

    *graph_out = NULL;
    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    // if (vxGetStatus((vx_reference)graph) == VX_SUCCESS)
    {
        vx_image virts[] = {
            vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT),
            vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT)
        };

        vx_kernel kernels[] = {
            vxGetKernelByEnum(context, VX_KERNEL_CHANNEL_EXTRACT),
            vxGetKernelByEnum(context, VX_KERNEL_MEDIAN_3x3),
            vxGetKernelByEnum(context, VX_KERNEL_HARRIS_CORNERS)
        };

        vx_node nodes[dimof(kernels)] = {
            vxCreateGenericNode(graph, kernels[0]),
            vxCreateGenericNode(graph, kernels[1]),
            vxCreateGenericNode(graph, kernels[2])
        };

        vx_scalar scalars[] = {
            vxCreateScalar(context, VX_TYPE_ENUM, &channel),
            vxCreateScalar(context, VX_TYPE_FLOAT32, &strength_thresh),
            vxCreateScalar(context, VX_TYPE_FLOAT32, &r),
            vxCreateScalar(context, VX_TYPE_FLOAT32, &sensitivity),
            vxCreateScalar(context, VX_TYPE_INT32, &window_size),
            vxCreateScalar(context, VX_TYPE_INT32, &block_size)
        };

        vx_parameter parameters[] = {
            vxGetParameterByIndex(nodes[0], 0),
            vxGetParameterByIndex(nodes[2], 6)
        };

        for (i = 0; i < dimof(virts); i++)
            ASSERT_VX_OBJECT(virts[i], VX_TYPE_IMAGE);
        for (i = 0; i < dimof(kernels); i++)
            ASSERT_VX_OBJECT(kernels[i], VX_TYPE_KERNEL);
        for (i = 0; i < dimof(nodes); i++)
            ASSERT_VX_OBJECT(nodes[i], VX_TYPE_NODE);
        for (i = 0; i < dimof(scalars); i++)
            ASSERT_VX_OBJECT(scalars[i], VX_TYPE_SCALAR);
        for (i = 0; i < dimof(parameters); i++)
            ASSERT_VX_OBJECT(parameters[i], VX_TYPE_PARAMETER);

        // Channel Extract
        VX_CALL(vxAddParameterToGraph(graph, parameters[0]));
        VX_CALL(vxSetParameterByIndex(nodes[0], 1, (vx_reference)scalars[0]));
        VX_CALL(vxSetParameterByIndex(nodes[0], 2, (vx_reference)virts[0]));
        // Median Filter
        VX_CALL(vxSetParameterByIndex(nodes[1], 0, (vx_reference)virts[0]));
        VX_CALL(vxSetParameterByIndex(nodes[1], 1, (vx_reference)virts[1]));
        // Harris Corners
        VX_CALL(vxSetParameterByIndex(nodes[2], 0, (vx_reference)virts[1]));
        VX_CALL(vxSetParameterByIndex(nodes[2], 1, (vx_reference)scalars[1]));
        VX_CALL(vxSetParameterByIndex(nodes[2], 2, (vx_reference)scalars[2]));
        VX_CALL(vxSetParameterByIndex(nodes[2], 3, (vx_reference)scalars[3]));
        VX_CALL(vxSetParameterByIndex(nodes[2], 4, (vx_reference)scalars[4]));
        VX_CALL(vxSetParameterByIndex(nodes[2], 5, (vx_reference)scalars[5]));
        VX_CALL(vxAddParameterToGraph(graph, parameters[1]));

        for (i = 0; i < dimof(scalars); i++)
        {
            VX_CALL(vxReleaseScalar(&scalars[i]));
            ASSERT(scalars[i] == NULL);
        }
        for (i = 0; i < dimof(virts); i++)
        {
            VX_CALL(vxReleaseImage(&virts[i]));
            ASSERT(virts[i] == NULL);
        }
        for (i = 0; i < dimof(kernels); i++)
        {
            VX_CALL(vxReleaseKernel(&kernels[i]));
            ASSERT(kernels[i] == NULL);
        }
        for (i = 0; i < dimof(nodes); i++)
        {
            VX_CALL(vxReleaseNode(&nodes[i]));
            ASSERT(nodes[i] == NULL);
        }
        for (i = 0; i < dimof(parameters); i++)
        {
            VX_CALL(vxReleaseParameter(&parameters[i]));
            ASSERT(parameters[i] == NULL);
        }
    }

    *graph_out = graph;
}

TEST(Graph, testGraphFactory)
{
    vx_context context = context_->vx_context_;
    vx_graph   graph;
    vx_image   source;
    vx_array   points;
    vx_parameter points_param;

    ASSERT_NO_FAILURE(testCornersGraphFactory(context, &graph));

    ASSERT_VX_OBJECT(source = vxCreateImage(context, 640, 480, VX_DF_IMAGE_YUV4), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(points = vxCreateArray(context, VX_TYPE_KEYPOINT, 100), VX_TYPE_ARRAY);

    ASSERT_NO_FAILURE(ct_fill_image_random(source, &CT()->seed_));

    VX_CALL(vxSetGraphParameterByIndex(graph, 0, (vx_reference)source));

    ASSERT_VX_OBJECT(points_param = vxGetGraphParameterByIndex(graph, 1), VX_TYPE_PARAMETER);
    VX_CALL(vxSetParameterByReference(points_param, (vx_reference)points));

    VX_CALL(vxReleaseParameter(&points_param));
    ASSERT(points_param == NULL);
    VX_CALL(vxReleaseImage(&source));
    ASSERT(source == NULL);

    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxReleaseArray(&points));
    ASSERT(points == NULL);

    VX_CALL(vxReleaseGraph(&graph));
    ASSERT(graph == NULL);
}

#define VX_KERNEL_CONFORMANCE_TEST_TAKE10_NAME "org.khronos.openvx.test.array_take_10"

static vx_status VX_CALLBACK take10_ParameterValidator(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[])
{
    vx_size capacity = 10;
    vx_enum type = VX_TYPE_KEYPOINT;

    // are we really required to set these attributes???
    VX_CALL_(return VX_FAILURE, vxSetMetaFormatAttribute(metas[1], VX_ARRAY_CAPACITY, &capacity, sizeof(capacity)));
    VX_CALL_(return VX_FAILURE, vxSetMetaFormatAttribute(metas[1], VX_ARRAY_ITEMTYPE, &type, sizeof(type)));

    return VX_SUCCESS;
}

static vx_status VX_CALLBACK take10_Kernel(vx_node node, const vx_reference *parameters, vx_uint32 num)
{
    vx_array input, output;
    vx_size len = 0;
    vx_size stride = 0;
    void* data = 0;
    vx_map_id map_id;
    ASSERT_(return VX_FAILURE, num == 2);
    ASSERT_VX_OBJECT_(return VX_FAILURE, input  = (vx_array)parameters[0], VX_TYPE_ARRAY);
    ASSERT_VX_OBJECT_(return VX_FAILURE, output = (vx_array)parameters[1], VX_TYPE_ARRAY);

    VX_CALL_(return VX_FAILURE, vxTruncateArray(output, 0));
    VX_CALL_(return VX_FAILURE, vxQueryArray(input, VX_ARRAY_NUMITEMS, &len, sizeof(len)));

    if (len > 10) len = 10;

    VX_CALL_(return VX_FAILURE, vxMapArrayRange(input,  0, len, &map_id, &stride, &data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X));
    VX_CALL_(return VX_FAILURE, vxAddArrayItems(output, len, data, stride));
    VX_CALL_(return VX_FAILURE, vxUnmapArrayRange(input, map_id));

    return VX_SUCCESS;
}

static void take10_node(vx_graph graph, vx_array in, vx_array out)
{
    vx_kernel kernel = 0;
    vx_node node = 0;
    vx_context context = vxGetContext((vx_reference)graph);
    vx_enum take10_enumId = 0u;

    ASSERT_VX_OBJECT(context, VX_TYPE_CONTEXT);

    VX_CALL(vxAllocateUserKernelId(context, &take10_enumId));
    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
            context,
            VX_KERNEL_CONFORMANCE_TEST_TAKE10_NAME,
            take10_enumId,
            take10_Kernel,
            2,
            take10_ParameterValidator,
            NULL,
            NULL), VX_TYPE_KERNEL);

    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT,  VX_TYPE_ARRAY, VX_PARAMETER_STATE_REQUIRED));
    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_ARRAY, VX_PARAMETER_STATE_REQUIRED));
    VX_CALL(vxFinalizeKernel(kernel));

    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)in));
    VX_CALL(vxSetParameterByIndex(node, 1, (vx_reference)out));

    VX_CALL(vxReleaseNode(&node));
    ASSERT(node == 0);

    VX_CALL(vxReleaseKernel(&kernel));
    ASSERT(kernel == 0);
}

TEST(Graph, testVirtualArray)
{
    vx_bool    use_estimations;
    vx_uint32  num_iter;
    vx_float32 threshold_f;
    vx_float32 eps;
    vx_scalar  fast_thresh;
    vx_scalar  flow_eps;
    vx_scalar  flow_num_iter;
    vx_scalar  flow_use_estimations;
    vx_size    window;
    vx_array   corners;
    vx_array   new_corners, corners10;
    vx_image   frame0 = 0;
    vx_image   frame1 = 0;
    vx_pyramid p0;
    vx_pyramid p1;
    vx_node    n1;
    vx_node    n2;
    vx_node    n3;
    vx_node    n4;
    vx_graph   graph;
    vx_context context;
    vx_kernel  kernel;
    CT_Image   src0 = 0, src1 = 0;
    vx_scalar  scalar_fastCorners = 0;
    vx_size    fastCorners = 0;

    ASSERT_VX_OBJECT(context = context_->vx_context_, VX_TYPE_CONTEXT);

    ASSERT_NO_FAILURE(src0 = ct_read_image("optflow_00.bmp", 1));
    ASSERT_NO_FAILURE(src1 = ct_read_image("optflow_01.bmp", 1));

    ASSERT_VX_OBJECT(frame0 = ct_image_to_vx_image(src0, context), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(frame1 = ct_image_to_vx_image(src1, context), VX_TYPE_IMAGE);

    threshold_f = 80;
    eps = 0.01f;
    num_iter = 10;
    use_estimations = vx_false_e;
    window = 3;

    ASSERT_VX_OBJECT(fast_thresh = vxCreateScalar(context, VX_TYPE_FLOAT32, &threshold_f), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(flow_eps = vxCreateScalar(context, VX_TYPE_FLOAT32, &eps), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(flow_num_iter = vxCreateScalar(context, VX_TYPE_UINT32, &num_iter), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(flow_use_estimations = vxCreateScalar(context, VX_TYPE_BOOL, &use_estimations), VX_TYPE_SCALAR);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    // Don't use zero capacity here
    ASSERT_VX_OBJECT(corners = vxCreateVirtualArray(graph, 0, 100), VX_TYPE_ARRAY);
    ASSERT_VX_OBJECT(new_corners = vxCreateVirtualArray(graph, 0, 0), VX_TYPE_ARRAY);
    ASSERT_VX_OBJECT(corners10   = vxCreateArray(context, VX_TYPE_KEYPOINT, 10), VX_TYPE_ARRAY);

    ASSERT_VX_OBJECT(scalar_fastCorners = vxCreateScalar(context, VX_TYPE_SIZE, &fastCorners), VX_TYPE_SCALAR);

    ASSERT_VX_OBJECT(n1 = vxFastCornersNode(graph, frame0, fast_thresh, vx_true_e, corners, scalar_fastCorners), VX_TYPE_NODE);

    ASSERT_VX_OBJECT(p0 = vxCreateVirtualPyramid(graph, 4, VX_SCALE_PYRAMID_HALF, 0, 0, VX_DF_IMAGE_VIRT), VX_TYPE_PYRAMID);
    ASSERT_VX_OBJECT(p1 = vxCreateVirtualPyramid(graph, 4, VX_SCALE_PYRAMID_HALF, 0, 0, VX_DF_IMAGE_VIRT), VX_TYPE_PYRAMID);

    ASSERT_VX_OBJECT(n2 = vxGaussianPyramidNode(graph, frame0, p0), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(n3 = vxGaussianPyramidNode(graph, frame1, p1), VX_TYPE_NODE);

    ASSERT_VX_OBJECT(n4 = vxOpticalFlowPyrLKNode(graph, p0, p1, corners, corners, new_corners, VX_TERM_CRITERIA_BOTH, flow_eps, flow_num_iter, flow_use_estimations, window), VX_TYPE_NODE);

    take10_node(graph, new_corners, corners10);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxCopyScalar(scalar_fastCorners, &fastCorners, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
    ASSERT(fastCorners > 0);

    VX_CALL(vxReleaseScalar(&scalar_fastCorners));
    VX_CALL(vxReleaseScalar(&fast_thresh));
    VX_CALL(vxReleaseScalar(&flow_eps));
    VX_CALL(vxReleaseScalar(&flow_num_iter));
    VX_CALL(vxReleaseScalar(&flow_use_estimations));
    VX_CALL(vxReleaseArray(&corners));
    VX_CALL(vxReleaseArray(&new_corners));
    VX_CALL(vxReleaseArray(&corners10));
    VX_CALL(vxReleasePyramid(&p0));
    VX_CALL(vxReleasePyramid(&p1));
    VX_CALL(vxReleaseImage(&frame0));
    VX_CALL(vxReleaseImage(&frame1));
    VX_CALL(vxReleaseNode(&n1));
    VX_CALL(vxReleaseNode(&n2));
    VX_CALL(vxReleaseNode(&n3));
    VX_CALL(vxReleaseNode(&n4));
    VX_CALL(vxReleaseGraph(&graph));

    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_TAKE10_NAME), VX_TYPE_KERNEL);
    VX_CALL(vxRemoveKernel(kernel));
}


TEST(Graph, testNodeRemove)
{
    vx_context context = context_->vx_context_;
    vx_image src_image = 0, interm_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0;
    vx_uint32 num_nodes = 0;

    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst_image), VX_TYPE_NODE);

    VX_CALL(vxQueryGraph(graph, VX_GRAPH_NUMNODES, &num_nodes, sizeof(num_nodes)));
    ASSERT(num_nodes == 2);

    VX_CALL(vxRemoveNode(&node2));
    ASSERT(node2 == 0);

    VX_CALL(vxQueryGraph(graph, VX_GRAPH_NUMNODES, &num_nodes, sizeof(num_nodes)));
    ASSERT(num_nodes == 1);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&interm_image));
    VX_CALL(vxReleaseImage(&src_image));

    ASSERT(node1 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
}

TEST(Graph, testNodeFromEnum)
{
    vx_context context = context_->vx_context_;
    vx_image src_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_kernel kernel = 0;
    vx_node node = 0;
    vx_uint32 num_params = 0;
    vx_parameter parameter = 0;
    vx_image p_image = 0;

    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(kernel = vxGetKernelByEnum(context, VX_KERNEL_BOX_3x3), VX_TYPE_KERNEL);

    VX_CALL(vxQueryKernel(kernel, VX_KERNEL_PARAMETERS, &num_params, sizeof(num_params)));
    ASSERT_EQ_INT(2, num_params);

    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);

    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)src_image));

    ASSERT_VX_OBJECT(parameter = vxGetParameterByIndex(node, 0), VX_TYPE_PARAMETER);
    VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_REF, &p_image, sizeof(p_image)));
    ASSERT(p_image == src_image);
    VX_CALL(vxReleaseImage(&p_image));
    VX_CALL(vxReleaseParameter(&parameter));

    {
        /* check set node parameter by reference */
        ASSERT_VX_OBJECT(parameter = vxGetParameterByIndex(node, 1), VX_TYPE_PARAMETER);

        /* parameter was not set yet */
        VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_REF, &p_image, sizeof(p_image)));
        ASSERT(p_image != dst_image);
        VX_CALL(vxSetParameterByReference(parameter, (vx_reference)dst_image));
        /* expect parameter is set to know value */
        VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_REF, &p_image, sizeof(p_image)));
        ASSERT(p_image == dst_image);
    }

    VX_CALL(vxReleaseImage(&p_image));
    VX_CALL(vxReleaseParameter(&parameter));

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxReleaseNode(&node));
    VX_CALL(vxReleaseKernel(&kernel));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&src_image));

    ASSERT(node == 0);
    ASSERT(kernel == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(src_image == 0);
}

TEST(Graph, testTwoNodesWithSameDst)
{
    vx_context context = context_->vx_context_;
    vx_image src1_image = 0, src2_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0;

    ASSERT_VX_OBJECT(src1_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(src2_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src1_image, dst_image), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node2 = vxMedian3x3Node(graph, src2_image, dst_image), VX_TYPE_NODE);

    EXPECT_NE_VX_STATUS(vxVerifyGraph(graph), VX_SUCCESS);

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseNode(&node2));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&src1_image));
    VX_CALL(vxReleaseImage(&src2_image));

    ASSERT(node1 == 0); ASSERT(node2 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(src1_image == 0); ASSERT(src2_image == 0);
}

TEST(Graph, testCycle)
{
    vx_context context = context_->vx_context_;
    vx_image src_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0;

    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, dst_image), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node2 = vxMedian3x3Node(graph, dst_image, src_image), VX_TYPE_NODE);

    EXPECT_NE_VX_STATUS(vxVerifyGraph(graph), VX_SUCCESS);

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseNode(&node2));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&src_image));

    ASSERT(node1 == 0); ASSERT(node2 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(src_image == 0);
}

TEST(Graph, testCycle2)
{
    vx_context context = context_->vx_context_;
    vx_image src1_image = 0, src2_image = 0, interm_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0, node3 = 0;

    ASSERT_VX_OBJECT(src1_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(src2_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(node1 = vxAddNode(graph, src1_image, src2_image, VX_CONVERT_POLICY_SATURATE, interm_image), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node2 = vxBox3x3Node(graph, interm_image, dst_image), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node3 = vxMedian3x3Node(graph, dst_image, src2_image), VX_TYPE_NODE);

    EXPECT_NE_VX_STATUS(vxVerifyGraph(graph), VX_SUCCESS);

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseNode(&node2));
    VX_CALL(vxReleaseNode(&node3));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&src1_image));
    VX_CALL(vxReleaseImage(&src2_image));
    VX_CALL(vxReleaseImage(&interm_image));

    ASSERT(node1 == 0); ASSERT(node2 == 0); ASSERT(node3 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(src1_image == 0); ASSERT(src2_image == 0); ASSERT(interm_image == 0);
}


TEST(Graph, testMultipleRun)
{
    vx_context context = context_->vx_context_;
    vx_image src_image = 0, interm_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0;
    CT_Image res1 = 0, res2 = 0;
    vx_border_t border = { VX_BORDER_UNDEFINED };

    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_NO_FAILURE(ct_fill_image_random(src_image, &CT()->seed_));
    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
    VX_CALL(vxSetNodeAttribute(node1, VX_NODE_BORDER, &border, sizeof(border)));
    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst_image), VX_TYPE_NODE);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));
    ASSERT_NO_FAILURE(res1 = ct_image_from_vx_image(dst_image));

    ASSERT_NO_FAILURE(ct_fill_image_random(dst_image, &CT()->seed_));

    VX_CALL(vxProcessGraph(graph));
    ASSERT_NO_FAILURE(res2 = ct_image_from_vx_image(dst_image));

    ct_adjust_roi(res1, 1, 1, 1, 1);
    ct_adjust_roi(res2, 1, 1, 1, 1);

    ASSERT_EQ_CTIMAGE(res1, res2);

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseNode(&node2));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&interm_image));
    VX_CALL(vxReleaseImage(&src_image));

    ASSERT(node1 == 0); ASSERT(node2 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
}


TEST(Graph, testMultipleRunAsync)
{
    vx_context context = context_->vx_context_;
    vx_image src_image = 0, interm_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0;
    CT_Image res1 = 0, res2 = 0;
    vx_border_t border = { VX_BORDER_UNDEFINED };

    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_NO_FAILURE(ct_fill_image_random(src_image, &CT()->seed_));
    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
    VX_CALL(vxSetNodeAttribute(node1, VX_NODE_BORDER, &border, sizeof(border)));
    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst_image), VX_TYPE_NODE);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxScheduleGraph(graph));
    VX_CALL(vxWaitGraph(graph));
    ASSERT_NO_FAILURE(res1 = ct_image_from_vx_image(dst_image));

    ASSERT_NO_FAILURE(ct_fill_image_random(dst_image, &CT()->seed_));

    VX_CALL(vxScheduleGraph(graph));
    VX_CALL(vxWaitGraph(graph));
    ASSERT_NO_FAILURE(res2 = ct_image_from_vx_image(dst_image));

    ct_adjust_roi(res1, 1, 1, 1, 1);
    ct_adjust_roi(res2, 1, 1, 1, 1);

    ASSERT_EQ_CTIMAGE(res1, res2);

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseNode(&node2));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&interm_image));
    VX_CALL(vxReleaseImage(&src_image));

    ASSERT(node1 == 0); ASSERT(node2 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
}


TEST(Graph, testAsyncWaitWithoutSchedule)
{
    vx_context context = context_->vx_context_;
    vx_image src_image = 0, interm_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0;

    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst_image), VX_TYPE_NODE);

    VX_CALL(vxVerifyGraph(graph));
    ASSERT_NE_VX_STATUS(VX_SUCCESS, vxWaitGraph(graph));

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseNode(&node2));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&interm_image));
    VX_CALL(vxReleaseImage(&src_image));

    ASSERT(node1 == 0); ASSERT(node2 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
}


TEST(Graph, testNodePerformance)
{
    vx_context context = context_->vx_context_;
    vx_image src_image = 0, interm_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0;
    vx_perf_t perf;
    vx_perf_t perf2;

    VX_CALL(vxDirective((vx_reference)context, VX_DIRECTIVE_ENABLE_PERFORMANCE));

    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst_image), VX_TYPE_NODE);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxQueryNode(node1, VX_NODE_PERFORMANCE, &perf, sizeof(perf)));

    ASSERT(perf.num == 1);
    ASSERT(perf.beg > 0);
    ASSERT(perf.min > 0);

    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxQueryNode(node1, VX_NODE_PERFORMANCE, &perf2, sizeof(perf)));

    ASSERT(perf2.num == 2);
    ASSERT(perf2.beg > perf.end);
    ASSERT(perf2.min > 0);
    ASSERT(perf2.sum > perf.sum);

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseNode(&node2));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&interm_image));
    VX_CALL(vxReleaseImage(&src_image));

    ASSERT(node1 == 0); ASSERT(node2 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
}


TEST(Graph, testGraphPerformance)
{
    vx_context context = context_->vx_context_;
    vx_image src_image = 0, interm_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0;
    vx_perf_t perf;
    vx_perf_t perf2;

    VX_CALL(vxDirective((vx_reference)context, VX_DIRECTIVE_ENABLE_PERFORMANCE));

    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst_image), VX_TYPE_NODE);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxQueryGraph(graph, VX_GRAPH_PERFORMANCE, &perf, sizeof(perf)));

    ASSERT(perf.num == 1);
    ASSERT(perf.beg > 0);
    ASSERT(perf.min > 0);

    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxQueryGraph(graph, VX_GRAPH_PERFORMANCE, &perf2, sizeof(perf)));

    ASSERT(perf2.num == 2);
    ASSERT(perf2.beg >= perf.end);
    ASSERT(perf2.min > 0);
    ASSERT(perf2.sum >= perf.sum);

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseNode(&node2));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&interm_image));
    VX_CALL(vxReleaseImage(&src_image));

    ASSERT(node1 == 0); ASSERT(node2 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
}

typedef struct
{
    char* name;
    vx_enum kernel_id;
} kernel_name_arg;

TEST_WITH_ARG(Graph, testKernelName, kernel_name_arg,
    ARG("org.khronos.openvx.color_convert",         VX_KERNEL_COLOR_CONVERT),
    ARG("org.khronos.openvx.channel_extract",       VX_KERNEL_CHANNEL_EXTRACT),
    ARG("org.khronos.openvx.channel_combine",       VX_KERNEL_CHANNEL_COMBINE),
    ARG("org.khronos.openvx.sobel_3x3",             VX_KERNEL_SOBEL_3x3),
    ARG("org.khronos.openvx.magnitude",             VX_KERNEL_MAGNITUDE),
    ARG("org.khronos.openvx.phase",                 VX_KERNEL_PHASE),
    ARG("org.khronos.openvx.scale_image",           VX_KERNEL_SCALE_IMAGE),
    ARG("org.khronos.openvx.table_lookup",          VX_KERNEL_TABLE_LOOKUP),
    ARG("org.khronos.openvx.histogram",             VX_KERNEL_HISTOGRAM),
    ARG("org.khronos.openvx.equalize_histogram",    VX_KERNEL_EQUALIZE_HISTOGRAM),
    ARG("org.khronos.openvx.absdiff",               VX_KERNEL_ABSDIFF),
    ARG("org.khronos.openvx.mean_stddev",           VX_KERNEL_MEAN_STDDEV),
    ARG("org.khronos.openvx.threshold",             VX_KERNEL_THRESHOLD),
    ARG("org.khronos.openvx.integral_image",        VX_KERNEL_INTEGRAL_IMAGE),
    ARG("org.khronos.openvx.dilate_3x3",            VX_KERNEL_DILATE_3x3),
    ARG("org.khronos.openvx.erode_3x3",             VX_KERNEL_ERODE_3x3),
    ARG("org.khronos.openvx.median_3x3",            VX_KERNEL_MEDIAN_3x3),
    ARG("org.khronos.openvx.box_3x3",               VX_KERNEL_BOX_3x3),
    ARG("org.khronos.openvx.gaussian_3x3",          VX_KERNEL_GAUSSIAN_3x3),
    ARG("org.khronos.openvx.custom_convolution",    VX_KERNEL_CUSTOM_CONVOLUTION),
    ARG("org.khronos.openvx.gaussian_pyramid",      VX_KERNEL_GAUSSIAN_PYRAMID),
    ARG("org.khronos.openvx.accumulate",            VX_KERNEL_ACCUMULATE),
    ARG("org.khronos.openvx.accumulate_weighted",   VX_KERNEL_ACCUMULATE_WEIGHTED),
    ARG("org.khronos.openvx.accumulate_square",     VX_KERNEL_ACCUMULATE_SQUARE),
    ARG("org.khronos.openvx.minmaxloc",             VX_KERNEL_MINMAXLOC),
    ARG("org.khronos.openvx.convertdepth",          VX_KERNEL_CONVERTDEPTH),
    ARG("org.khronos.openvx.canny_edge_detector",   VX_KERNEL_CANNY_EDGE_DETECTOR),
    ARG("org.khronos.openvx.and",                   VX_KERNEL_AND),
    ARG("org.khronos.openvx.or",                    VX_KERNEL_OR),
    ARG("org.khronos.openvx.xor",                   VX_KERNEL_XOR),
    ARG("org.khronos.openvx.not",                   VX_KERNEL_NOT),
    ARG("org.khronos.openvx.multiply",              VX_KERNEL_MULTIPLY),
    ARG("org.khronos.openvx.add",                   VX_KERNEL_ADD),
    ARG("org.khronos.openvx.subtract",              VX_KERNEL_SUBTRACT),
    ARG("org.khronos.openvx.warp_affine",           VX_KERNEL_WARP_AFFINE),
    ARG("org.khronos.openvx.warp_perspective",      VX_KERNEL_WARP_PERSPECTIVE),
    ARG("org.khronos.openvx.harris_corners",        VX_KERNEL_HARRIS_CORNERS),
    ARG("org.khronos.openvx.fast_corners",          VX_KERNEL_FAST_CORNERS),
    ARG("org.khronos.openvx.optical_flow_pyr_lk",   VX_KERNEL_OPTICAL_FLOW_PYR_LK),
    ARG("org.khronos.openvx.remap",                 VX_KERNEL_REMAP),
    ARG("org.khronos.openvx.halfscale_gaussian",    VX_KERNEL_HALFSCALE_GAUSSIAN),
    ARG("org.khronos.openvx.min",                   VX_KERNEL_MIN),
    ARG("org.khronos.openvx.max",                   VX_KERNEL_MAX),
    )
{
    vx_context context = context_->vx_context_;
    vx_kernel kernel   = 0;
    vx_enum   kernel_id = 0;

    EXPECT_VX_OBJECT(kernel = vxGetKernelByName(context, arg_->name), VX_TYPE_KERNEL);

    if (CT_HasFailure())
    {
        vx_char name[VX_MAX_KERNEL_NAME] = {0};

        ASSERT_VX_OBJECT(kernel = vxGetKernelByEnum(context, arg_->kernel_id), VX_TYPE_KERNEL);
        VX_CALL(vxQueryKernel(kernel, VX_KERNEL_NAME, &name, sizeof(name)));
        printf("\tExpected kernel name is: %s\n", arg_->name);
        printf("\tActual kernel name is:   %-*s\n", VX_MAX_KERNEL_NAME, name);
    }
    else
    {
        VX_CALL(vxQueryKernel(kernel, VX_KERNEL_ENUM, &kernel_id, sizeof(kernel_id)));
        EXPECT_EQ_INT(arg_->kernel_id, kernel_id);
    }

    VX_CALL(vxReleaseKernel(&kernel));
}

TEST(Graph, testAllocateUserKernelId)
{
    vx_context context = context_->vx_context_;
    vx_enum   kernel_id = 0;

    ASSERT_EQ_VX_STATUS(vxAllocateUserKernelId(NULL, &kernel_id), VX_ERROR_INVALID_REFERENCE);
    ASSERT_NE_VX_STATUS(vxAllocateUserKernelId(context, NULL), VX_SUCCESS);

    VX_CALL(vxAllocateUserKernelId(context, &kernel_id));

    ASSERT(kernel_id >= VX_KERNEL_BASE(VX_ID_USER, 0));
    ASSERT(kernel_id < (VX_KERNEL_BASE(VX_ID_USER, 0) + 4096));
}

TEST(Graph, testAllocateUserKernelLibraryId)
{
    vx_context context = context_->vx_context_;
    vx_enum   library_id = 0;

    ASSERT_EQ_VX_STATUS(vxAllocateUserKernelLibraryId(NULL, &library_id), VX_ERROR_INVALID_REFERENCE);
    ASSERT_NE_VX_STATUS(vxAllocateUserKernelLibraryId(context, NULL), VX_SUCCESS);

    VX_CALL(vxAllocateUserKernelLibraryId(context, &library_id));

    ASSERT(library_id >= 1);
    ASSERT(library_id <= 255);
}

void test_case_1(vx_context context, vx_uint32 width, vx_uint32 height)
{
    vx_image src1 = 0;
    vx_image src2 = 0;
    vx_image d1 = 0;
    vx_image d2 = 0;
    vx_image res = 0;
    vx_graph graph = 0;
    vx_node N1 = 0;
    vx_node N2 = 0;
    vx_node node3 = 0;
    vx_node node4 = 0;
    vx_pixel_value_t src1_val = {{ 1 }};
    vx_pixel_value_t src2_val = {{ 2 }};
    vx_rectangle_t roi_rect = { width / 2, height / 2, width, height };
    vx_enum convert_policy = VX_CONVERT_POLICY_SATURATE;
    vx_scalar mean1 = 0;
    vx_scalar stddev1 = 0;
    vx_float32 mean_val1 = 0.0f;
    vx_float32 stddev_val1 = 0.0f;
    vx_scalar mean2 = 0;
    vx_scalar stddev2 = 0;
    vx_float32 mean_val2 = 0.0f;
    vx_float32 stddev_val2 = 0.0f;

    ASSERT_VX_OBJECT(src1 = vxCreateUniformImage(context, width, height, VX_DF_IMAGE_U8, &src1_val), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(src2 = vxCreateUniformImage(context, width, height, VX_DF_IMAGE_U8, &src2_val), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(d1 = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(d2 = vxCreateImageFromROI(d1, &roi_rect), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(res = vxCreateImage(context, width / 2, height / 2, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(mean1 = vxCreateScalar(context, VX_TYPE_FLOAT32, &mean_val1), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(stddev1 = vxCreateScalar(context, VX_TYPE_FLOAT32, &stddev_val1), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(mean2 = vxCreateScalar(context, VX_TYPE_FLOAT32, &mean_val2), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(stddev2 = vxCreateScalar(context, VX_TYPE_FLOAT32, &stddev_val2), VX_TYPE_SCALAR);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    /* add nodes in arbitrary order */
    ASSERT_VX_OBJECT(node3 = vxMeanStdDevNode(graph, res, mean1, stddev1), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(N2 = vxNotNode(graph, d2, res), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node4 = vxMeanStdDevNode(graph, d1, mean2, stddev2), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(N1 = vxAddNode(graph, src1, src2, convert_policy, d1), VX_TYPE_NODE);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxCopyScalar(mean1, &mean_val1, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
    VX_CALL(vxCopyScalar(stddev1, &stddev_val1, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
    VX_CALL(vxCopyScalar(mean2, &mean_val2, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
    VX_CALL(vxCopyScalar(stddev2, &stddev_val2, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));

    EXPECT_EQ_INT((vx_uint8)( ~(src1_val.U8 + src2_val.U8) ), (vx_uint8)mean_val1);
    EXPECT_EQ_INT((vx_uint8)((src1_val.U8 + src2_val.U8)), (vx_uint8)mean_val2);

    VX_CALL(vxReleaseNode(&N1));
    VX_CALL(vxReleaseNode(&N2));
    VX_CALL(vxReleaseNode(&node3));
    VX_CALL(vxReleaseNode(&node4));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&src1));
    VX_CALL(vxReleaseImage(&src2));
    VX_CALL(vxReleaseImage(&d1));
    VX_CALL(vxReleaseImage(&d2));
    VX_CALL(vxReleaseImage(&res));
    VX_CALL(vxReleaseScalar(&mean1));
    VX_CALL(vxReleaseScalar(&stddev1));
    VX_CALL(vxReleaseScalar(&mean2));
    VX_CALL(vxReleaseScalar(&stddev2));

    ASSERT(N1 == 0);
    ASSERT(N2 == 0);
    ASSERT(node3 == 0);
    ASSERT(node4 == 0);
    ASSERT(graph == 0);
    ASSERT(src1 == 0);
    ASSERT(src2 == 0);
    ASSERT(d1 == 0);
    ASSERT(d2 == 0);
    ASSERT(res == 0);
    ASSERT(mean1 == 0);
    ASSERT(stddev1 == 0);
    ASSERT(mean2 == 0);
    ASSERT(stddev2 == 0);

    return;
}


void test_case_2(vx_context context, vx_uint32 width, vx_uint32 height)
{
    vx_image d2 = 0;
    vx_image src1 = 0;
    vx_image src2 = 0;
    vx_image d1 = 0;
    vx_image res = 0;
    vx_graph graph = 0;
    vx_node N1 = 0;
    vx_node N2 = 0;
    vx_node node3 = 0;
    vx_node node4 = 0;
    vx_pixel_value_t d2_val = {{ 1 }};
    vx_pixel_value_t src1_val = {{ 2 }};
    vx_pixel_value_t src2_val = {{ 3 }};
    vx_rectangle_t img_rect = { 0, 0, width, height };
    vx_rectangle_t roi_rect = { width / 2, height / 2, width, height };
    vx_imagepatch_addressing_t addr = { 0 };
    vx_uint8* base_ptr = NULL;
    vx_enum convert_policy = VX_CONVERT_POLICY_SATURATE;
    vx_scalar mean1 = 0;
    vx_scalar stddev1 = 0;
    vx_float32 mean_val1 = 0.0f;
    vx_float32 stddev_val1 = 0.0f;
    vx_scalar mean2 = 0;
    vx_scalar stddev2 = 0;
    vx_float32 mean_val2 = 0.0f;
    vx_float32 stddev_val2 = 0.0f;
    vx_map_id map_id;
    vx_uint32 x, y;

    ASSERT_VX_OBJECT(mean1   = vxCreateScalar(context, VX_TYPE_FLOAT32, &mean_val1), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(stddev1 = vxCreateScalar(context, VX_TYPE_FLOAT32, &stddev_val1), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(mean2   = vxCreateScalar(context, VX_TYPE_FLOAT32, &mean_val2), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(stddev2 = vxCreateScalar(context, VX_TYPE_FLOAT32, &stddev_val2), VX_TYPE_SCALAR);

    ASSERT_VX_OBJECT(d2 = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    VX_CALL(vxMapImagePatch(d2, &img_rect, 0, &map_id, &addr, (void**)&base_ptr, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
    for ( y = 0; y < addr.dim_y; y += addr.step_y)
    {
        for ( x = 0; x < addr.dim_x; x += addr.step_x)
        {
            vx_uint8* ptr = vxFormatImagePatchAddress2d(base_ptr, x, y, &addr);
            *ptr = d2_val.U8;
        }
    }
    VX_CALL(vxUnmapImagePatch(d2, map_id));

    ASSERT_VX_OBJECT(d1 = vxCreateImageFromROI(d2, &roi_rect), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(src1 = vxCreateUniformImage(context, width / 2, height / 2, VX_DF_IMAGE_U8, &src1_val), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(src2 = vxCreateUniformImage(context, width / 2, height / 2, VX_DF_IMAGE_U8, &src2_val), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(res = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    /* add nodes in arbitrary order */
    ASSERT_VX_OBJECT(node3 = vxMeanStdDevNode(graph, d1, mean2, stddev2), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(N2 = vxMeanStdDevNode(graph, res, mean1, stddev1), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(node4 = vxNotNode(graph, d2, res), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(N1 = vxAddNode(graph, src1, src2, convert_policy, d1), VX_TYPE_NODE);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxCopyScalar(mean1, &mean_val1, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
    VX_CALL(vxCopyScalar(stddev1, &stddev_val1, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
    VX_CALL(vxCopyScalar(mean2, &mean_val2, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
    VX_CALL(vxCopyScalar(stddev2, &stddev_val2, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));

    EXPECT_EQ_INT((vx_uint8)(~(src1_val.U8 + src2_val.U8) / 2), (vx_uint8)mean_val1);
    EXPECT_EQ_INT((vx_uint8)((src1_val.U8 + src2_val.U8)), (vx_uint8)mean_val2);

    VX_CALL(vxReleaseNode(&N1));
    VX_CALL(vxReleaseNode(&N2));
    VX_CALL(vxReleaseNode(&node3));
    VX_CALL(vxReleaseNode(&node4));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&src1));
    VX_CALL(vxReleaseImage(&src2));
    VX_CALL(vxReleaseImage(&d1));
    VX_CALL(vxReleaseImage(&d2));
    VX_CALL(vxReleaseImage(&res));
    VX_CALL(vxReleaseScalar(&mean1));
    VX_CALL(vxReleaseScalar(&stddev1));
    VX_CALL(vxReleaseScalar(&mean2));
    VX_CALL(vxReleaseScalar(&stddev2));

    ASSERT(N1 == 0);
    ASSERT(N2 == 0);
    ASSERT(node3 == 0);
    ASSERT(node4 == 0);
    ASSERT(graph == 0);
    ASSERT(src1 == 0);
    ASSERT(src2 == 0);
    ASSERT(d1 == 0);
    ASSERT(d2 == 0);
    ASSERT(res == 0);
    ASSERT(mean1 == 0);
    ASSERT(stddev1 == 0);
    ASSERT(mean2 == 0);
    ASSERT(stddev2 == 0);

    return;
}


void test_case_3(vx_context context, vx_uint32 width, vx_uint32 height)
{
    vx_image image = 0;
    vx_image src1 = 0;
    vx_image src2 = 0;
    vx_image d1 = 0;
    vx_image d2 = 0;
    vx_graph graph = 0;
    vx_node N1 = 0;
    vx_node N2 = 0;
    vx_node node = 0;
    vx_pixel_value_t val = {{ 1 }};
    vx_pixel_value_t src1_val = {{ 2 }};
    vx_pixel_value_t src2_val = {{ 3 }};
    vx_rectangle_t img_rect = { 0, 0, width, height };
    vx_rectangle_t roi_rect1 = { width / 2, height / 2, width, height };
    vx_rectangle_t roi_rect2 = { 0, height / 2, width, height };
    vx_imagepatch_addressing_t addr = { 0 };
    vx_uint8* base_ptr = NULL;
    vx_enum convert_policy = VX_CONVERT_POLICY_SATURATE;
    vx_scalar mean1 = 0;
    vx_scalar stddev1 = 0;
    vx_float32 mean_val1 = 0.0f;
    vx_float32 stddev_val1 = 0.0f;
    vx_scalar mean2 = 0;
    vx_scalar stddev2 = 0;
    vx_float32 mean_val2 = 0.0f;
    vx_float32 stddev_val2 = 0.0f;
    vx_map_id map_id;
    vx_uint32 x, y;

    ASSERT_VX_OBJECT(image = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    VX_CALL(vxMapImagePatch(image, &img_rect, 0, &map_id, &addr, (void**)&base_ptr, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
    for ( y = 0; y < addr.dim_y; y += addr.step_y)
    {
        for ( x = 0; x < addr.dim_x; x += addr.step_x)
        {
            vx_uint8* ptr = vxFormatImagePatchAddress2d(base_ptr, x, y, &addr);
            *ptr = val.U8;
        }
    }
    VX_CALL(vxUnmapImagePatch(image, map_id));

    ASSERT_VX_OBJECT(src1 = vxCreateUniformImage(context, width / 2, height / 2, VX_DF_IMAGE_U8, &src1_val), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(src2 = vxCreateUniformImage(context, width / 2, height / 2, VX_DF_IMAGE_U8, &src2_val), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(d1 = vxCreateImageFromROI(image, &roi_rect1), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(d2 = vxCreateImageFromROI(image, &roi_rect2), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(mean1 = vxCreateScalar(context, VX_TYPE_FLOAT32, &mean_val1), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(stddev1 = vxCreateScalar(context, VX_TYPE_FLOAT32, &stddev_val1), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(mean2 = vxCreateScalar(context, VX_TYPE_FLOAT32, &mean_val2), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(stddev2 = vxCreateScalar(context, VX_TYPE_FLOAT32, &stddev_val2), VX_TYPE_SCALAR);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    /* add nodes in arbitrary order */
    ASSERT_VX_OBJECT(node = vxMeanStdDevNode(graph, d1, mean2, stddev2), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(N2 = vxMeanStdDevNode(graph, d2, mean1, stddev1), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(N1 = vxAddNode(graph, src1, src2, convert_policy, d1), VX_TYPE_NODE);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxCopyScalar(mean1, &mean_val1, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
    VX_CALL(vxCopyScalar(stddev1, &stddev_val1, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
    VX_CALL(vxCopyScalar(mean2, &mean_val2, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
    VX_CALL(vxCopyScalar(stddev2, &stddev_val2, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));

    EXPECT_EQ_INT((vx_uint8)((val.U8 + src1_val.U8 + src2_val.U8) / 2), (vx_uint8)mean_val1);
    EXPECT_EQ_INT((vx_uint8)((src1_val.U8 + src2_val.U8)), (vx_uint8)mean_val2);

    VX_CALL(vxReleaseNode(&N1));
    VX_CALL(vxReleaseNode(&N2));
    VX_CALL(vxReleaseNode(&node));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&image));
    VX_CALL(vxReleaseImage(&src1));
    VX_CALL(vxReleaseImage(&src2));
    VX_CALL(vxReleaseImage(&d1));
    VX_CALL(vxReleaseImage(&d2));
    VX_CALL(vxReleaseScalar(&mean1));
    VX_CALL(vxReleaseScalar(&stddev1));
    VX_CALL(vxReleaseScalar(&mean2));
    VX_CALL(vxReleaseScalar(&stddev2));

    ASSERT(N1 == 0);
    ASSERT(N2 == 0);
    ASSERT(node == 0);
    ASSERT(graph == 0);
    ASSERT(image == 0);
    ASSERT(src1 == 0);
    ASSERT(src2 == 0);
    ASSERT(d1 == 0);
    ASSERT(d2 == 0);
    ASSERT(mean1 == 0);
    ASSERT(stddev1 == 0);
    ASSERT(mean2 == 0);
    ASSERT(stddev2 == 0);

    return;
}


void test_case_4(vx_context context, vx_uint32 width, vx_uint32 height)
{
    vx_image image = 0;
    vx_pyramid d1 = 0;
    vx_image d2 = 0;
    vx_graph graph = 0;
    vx_node N1 = 0;
    vx_node N2 = 0;
    vx_pixel_value_t val = {{ 5 }};
    vx_size levels = 3;
    vx_float32 scale = VX_SCALE_PYRAMID_HALF;
    vx_scalar mean1 = 0;
    vx_scalar stddev1 = 0;
    vx_float32 mean_val1 = 0.0f;
    vx_float32 stddev_val1 = 0.0f;

    ASSERT_VX_OBJECT(image = vxCreateUniformImage(context, width, height, VX_DF_IMAGE_U8, &val), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(d1 = vxCreatePyramid(context, levels, scale, width, height, VX_DF_IMAGE_U8), VX_TYPE_PYRAMID);
    ASSERT_VX_OBJECT(d2 = vxGetPyramidLevel(d1, 0), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(mean1 = vxCreateScalar(context, VX_TYPE_FLOAT32, &mean_val1), VX_TYPE_SCALAR);
    ASSERT_VX_OBJECT(stddev1 = vxCreateScalar(context, VX_TYPE_FLOAT32, &stddev_val1), VX_TYPE_SCALAR);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    /* add nodes in arbitrary order */
    ASSERT_VX_OBJECT(N2 = vxMeanStdDevNode(graph, d2, mean1, stddev1), VX_TYPE_NODE);
    ASSERT_VX_OBJECT(N1 = vxGaussianPyramidNode(graph, image, d1), VX_TYPE_NODE);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxCopyScalar(mean1, &mean_val1, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
    VX_CALL(vxCopyScalar(stddev1, &stddev_val1, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));

    EXPECT_EQ_INT(val.U8, (vx_uint8)mean_val1);

    VX_CALL(vxReleaseNode(&N1));
    VX_CALL(vxReleaseNode(&N2));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&image));
    VX_CALL(vxReleasePyramid(&d1));
    VX_CALL(vxReleaseImage(&d2));
    VX_CALL(vxReleaseScalar(&mean1));
    VX_CALL(vxReleaseScalar(&stddev1));

    ASSERT(N1 == 0);
    ASSERT(N2 == 0);
    ASSERT(graph == 0);
    ASSERT(image == 0);
    ASSERT(d1 == 0);
    ASSERT(d2 == 0);
    ASSERT(mean1 == 0);
    ASSERT(stddev1 == 0);

    return;
}


TEST(Graph, testImageContainmentRelationship)
{
    vx_context context = context_->vx_context_;
    vx_uint32 width = 128;
    vx_uint32 height = 128;
    test_case_1(context, width, height);
    test_case_2(context, width, height);
    test_case_3(context, width, height);
    test_case_4(context, width, height);
}


/* test replicate node */

static CT_Image own_generate_random(const char* fileName, int width, int height)
{
    CT_Image image;

    ASSERT_NO_FAILURE_(return 0,
        image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_U8, &CT()->seed_, 0, 256));

    return image;
}

typedef enum
{
    ADD = 0,
    SUB,
    MUL,
    LUT

} OWN_OPERATION_TYPE;

typedef struct
{
    const char* testName;
    CT_Image(*generator)(const char* fileName, int width, int height);
    const char* fileName;
    int width;
    int height;
    vx_size levels;
    vx_float32 scale;
    vx_df_image format;
    OWN_OPERATION_TYPE op;
} Test_Replicate_Arg;


#define ADD_SIZE_SET(testArgName, nextmacro, ...) \
    CT_EXPAND(nextmacro(testArgName "/sz=256x256", __VA_ARGS__, 256, 256)), \
    CT_EXPAND(nextmacro(testArgName "/sz=640x480", __VA_ARGS__, 640, 480))

#define ADD_VX_LEVELS(testArgName, nextmacro, ...) \
    CT_EXPAND(nextmacro(testArgName "/REPLICAS=3", __VA_ARGS__, 3)), \
    CT_EXPAND(nextmacro(testArgName "/REPLICAS=4", __VA_ARGS__, 4))

#define ADD_VX_SCALE(testArgName, nextmacro, ...) \
    CT_EXPAND(nextmacro(testArgName "/PYRAMID:SCALE_HALF", __VA_ARGS__, VX_SCALE_PYRAMID_HALF)), \
    CT_EXPAND(nextmacro(testArgName "/PYRAMID:SCALE_ORB", __VA_ARGS__, VX_SCALE_PYRAMID_ORB)), \
    CT_EXPAND(nextmacro(testArgName "/OBJECT_ARRAY", __VA_ARGS__, -1))

#define ADD_VX_FORMAT(testArgName, nextmacro, ...) \
    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U8", __VA_ARGS__, VX_DF_IMAGE_U8))

#define ADD_VX_OPERATION(testArgName, nextmacro, ...) \
    CT_EXPAND(nextmacro(testArgName "/Add", __VA_ARGS__, ADD)),  \
    CT_EXPAND(nextmacro(testArgName "/Sub", __VA_ARGS__, SUB)),  \
    CT_EXPAND(nextmacro(testArgName "/Mul", __VA_ARGS__, MUL)),  \
    CT_EXPAND(nextmacro(testArgName "/LUT", __VA_ARGS__, LUT))

#define TEST_REPLICATE_PARAMETERS \
    CT_GENERATE_PARAMETERS("random", ADD_SIZE_SET, ADD_VX_LEVELS, ADD_VX_SCALE, ADD_VX_FORMAT, ADD_VX_OPERATION, ARG, own_generate_random, NULL)

static void ref_replicate_op(vx_context context, vx_reference input1, vx_reference input2, vx_reference output, OWN_OPERATION_TYPE op)
{
    vx_uint32 i, k;
    vx_size levels = 0;
    vx_enum type = VX_TYPE_INVALID;

    VX_CALL(vxQueryReference(input1, VX_REFERENCE_TYPE, &type, sizeof(type)));

    if (type == VX_TYPE_PYRAMID)
    {
        VX_CALL(vxQueryPyramid((vx_pyramid)input1, VX_PYRAMID_LEVELS, &levels, sizeof(vx_size)));

        // add, sub, mul, lut
        for (k = 0; k < levels; k++)
        {
            vx_image src1 = 0;
            vx_image src2 = 0;
            vx_image dst = 0;
            vx_enum policy = VX_CONVERT_POLICY_SATURATE;
            vx_float32 scale_val = 1.0f;
            vx_enum rounding = VX_ROUND_POLICY_TO_ZERO;

            ASSERT_VX_OBJECT(src1 = vxGetPyramidLevel((vx_pyramid)input1, k), VX_TYPE_IMAGE);
            ASSERT_VX_OBJECT(src2 = vxGetPyramidLevel((vx_pyramid)input2, k), VX_TYPE_IMAGE);
            ASSERT_VX_OBJECT(dst = vxGetPyramidLevel((vx_pyramid)output, k), VX_TYPE_IMAGE);

            switch (op)
            {
            case ADD:
                VX_CALL(vxuAdd(context, src1, src2, policy, dst));
                break;

            case SUB:
                VX_CALL(vxuSubtract(context, src1, src2, policy, dst));
                break;

            case MUL:
                VX_CALL(vxuMultiply(context, src1, src2, scale_val, policy, rounding, dst));
                break;

            case LUT:
            {
                vx_lut lut = 0;
                vx_uint8* data = 0;
                vx_map_id map_id;
                ASSERT_VX_OBJECT(lut = vxCreateLUT(context, VX_TYPE_UINT8, 256), VX_TYPE_LUT);
                VX_CALL(vxMapLUT(lut, &map_id, (void **)&data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
                for (i = 0; i < 256; i++)
                    data[i] = 255 - i;
                VX_CALL(vxUnmapLUT(lut, map_id));
                VX_CALL(vxuTableLookup(context, src1, lut, dst));
                VX_CALL(vxReleaseLUT(&lut));
                break;
            }

            default:
                ASSERT(0);
            }

            VX_CALL(vxReleaseImage(&src1));
            VX_CALL(vxReleaseImage(&src2));
            VX_CALL(vxReleaseImage(&dst));
        }
    }
    else if (type == VX_TYPE_OBJECT_ARRAY)
    {
        VX_CALL(vxQueryObjectArray((vx_object_array)input1, VX_OBJECT_ARRAY_NUMITEMS, &levels, sizeof(vx_size)));

        // add, sub, mul, lut
        for (k = 0; k < levels; k++)
        {
            vx_image src1 = 0;
            vx_image src2 = 0;
            vx_image dst = 0;
            vx_enum policy = VX_CONVERT_POLICY_SATURATE;
            vx_float32 scale_val = 1.0f;
            vx_enum rounding = VX_ROUND_POLICY_TO_ZERO;

            ASSERT_VX_OBJECT(src1 = (vx_image)vxGetObjectArrayItem((vx_object_array)input1, k), VX_TYPE_IMAGE);
            ASSERT_VX_OBJECT(src2 = (vx_image)vxGetObjectArrayItem((vx_object_array)input2, k), VX_TYPE_IMAGE);
            ASSERT_VX_OBJECT(dst = (vx_image)vxGetObjectArrayItem((vx_object_array)output, k), VX_TYPE_IMAGE);

            switch (op)
            {
            case ADD:
                VX_CALL(vxuAdd(context, src1, src2, policy, dst));
                break;

            case SUB:
                VX_CALL(vxuSubtract(context, src1, src2, policy, dst));
                break;

            case MUL:
                VX_CALL(vxuMultiply(context, src1, src2, scale_val, policy, rounding, dst));
                break;

            case LUT:
            {
                vx_lut lut = 0;
                vx_uint8* data = 0;
                vx_map_id map_id;
                ASSERT_VX_OBJECT(lut = vxCreateLUT(context, VX_TYPE_UINT8, 256), VX_TYPE_LUT);
                VX_CALL(vxMapLUT(lut, &map_id, (void **)&data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
                for (i = 0; i < 256; i++)
                    data[i] = 255 - i - k;
                VX_CALL(vxUnmapLUT(lut, map_id));
                VX_CALL(vxuTableLookup(context, src1, lut, dst));
                VX_CALL(vxReleaseLUT(&lut));
                break;
            }

            default:
                ASSERT(0);
            }

            VX_CALL(vxReleaseImage(&src1));
            VX_CALL(vxReleaseImage(&src2));
            VX_CALL(vxReleaseImage(&dst));
        }
    }
    else
        ASSERT(0);

    return;
}

static void tst_replicate_op(vx_context context, vx_reference input1, vx_reference input2, vx_reference output, OWN_OPERATION_TYPE op)
{
    vx_graph graph = 0;
    vx_node node = 0;
    vx_object_array object_array = 0;
    vx_image src1 = 0;
    vx_image src2 = 0;
    vx_image dst = 0;
    vx_enum policy = VX_CONVERT_POLICY_SATURATE;
    vx_float32 scale_val = 1.0f;
    vx_scalar scale = 0;
    vx_enum rounding = VX_ROUND_POLICY_TO_ZERO;
    vx_size levels = 0;
    vx_enum type = VX_TYPE_INVALID;

    VX_CALL(vxQueryReference(input1, VX_REFERENCE_TYPE, &type, sizeof(type)));

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    if (type == VX_TYPE_PYRAMID)
    {
        ASSERT_VX_OBJECT(src1 = vxGetPyramidLevel((vx_pyramid)input1, 0), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(src2 = vxGetPyramidLevel((vx_pyramid)input2, 0), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(dst = vxGetPyramidLevel((vx_pyramid)output, 0), VX_TYPE_IMAGE);

        VX_CALL(vxQueryPyramid((vx_pyramid)input1, VX_PYRAMID_LEVELS, &levels, sizeof(levels)));

        // add, sub, mul, lut
        switch (op)
        {
        case ADD:
        {
            vx_bool replicate[] = { vx_true_e, vx_true_e, vx_false_e, vx_true_e };
            ASSERT_VX_OBJECT(node = vxAddNode(graph, src1, src2, policy, dst), VX_TYPE_NODE);
            VX_CALL(vxReplicateNode(graph, node, replicate, 4));
            break;
        }

        case SUB:
        {
            vx_bool replicate[] = { vx_true_e, vx_true_e, vx_false_e, vx_true_e };
            ASSERT_VX_OBJECT(node = vxSubtractNode(graph, src1, src2, policy, dst), VX_TYPE_NODE);
            VX_CALL(vxReplicateNode(graph, node, replicate, 4));
            break;
        }

        case MUL:
        {
            vx_bool replicate[] = { vx_true_e, vx_true_e, vx_false_e, vx_false_e, vx_false_e, vx_true_e };
            ASSERT_VX_OBJECT(scale = vxCreateScalar(context, VX_TYPE_FLOAT32, &scale_val), VX_TYPE_SCALAR);
            ASSERT_VX_OBJECT(node = vxMultiplyNode(graph, src1, src2, scale, policy, rounding, dst), VX_TYPE_NODE);
            VX_CALL(vxReplicateNode(graph, node, replicate, 6));
            VX_CALL(vxReleaseScalar(&scale));
            break;
        }

        case LUT:
        {
            vx_uint32 i;
            vx_lut lut = 0;
            vx_uint8* data = 0;
            vx_bool replicate[] = { vx_true_e, vx_false_e, vx_true_e };
            vx_map_id map_id;
            ASSERT_VX_OBJECT(lut = vxCreateLUT(context, VX_TYPE_UINT8, 256), VX_TYPE_LUT);
            VX_CALL(vxMapLUT(lut, &map_id, (void **)&data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
            for (i = 0; i < 256; i++)
                data[i] = 255 - i;
            VX_CALL(vxUnmapLUT(lut, map_id));
            ASSERT_VX_OBJECT(node = vxTableLookupNode(graph, src1, lut, dst), VX_TYPE_NODE);
            VX_CALL(vxReplicateNode(graph, node, replicate, 3));
            VX_CALL(vxReleaseLUT(&lut));
            break;
        }

        default:
            ASSERT(0);
        }
    }
    else if (type == VX_TYPE_OBJECT_ARRAY)
    {
        ASSERT_VX_OBJECT(src1 = (vx_image)vxGetObjectArrayItem((vx_object_array)input1, 0), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(src2 = (vx_image)vxGetObjectArrayItem((vx_object_array)input2, 0), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(dst = (vx_image)vxGetObjectArrayItem((vx_object_array)output, 0), VX_TYPE_IMAGE);

        VX_CALL(vxQueryObjectArray((vx_object_array)input1, VX_OBJECT_ARRAY_NUMITEMS, &levels, sizeof(levels)));

        // add, sub, mul, lut
        switch (op)
        {
        case ADD:
        {
            vx_bool replicate[] = { vx_true_e, vx_true_e, vx_false_e, vx_true_e };
            ASSERT_VX_OBJECT(node = vxAddNode(graph, src1, src2, policy, dst), VX_TYPE_NODE);
            VX_CALL(vxReplicateNode(graph, node, replicate, 4));
            break;
        }

        case SUB:
        {
            vx_bool replicate[] = { vx_true_e, vx_true_e, vx_false_e, vx_true_e };
            ASSERT_VX_OBJECT(node = vxSubtractNode(graph, src1, src2, policy, dst), VX_TYPE_NODE);
            VX_CALL(vxReplicateNode(graph, node, replicate, 4));
            break;
        }

        case MUL:
        {
            vx_bool replicate[] = { vx_true_e, vx_true_e, vx_false_e, vx_false_e, vx_false_e, vx_true_e };
            ASSERT_VX_OBJECT(scale = vxCreateScalar(context, VX_TYPE_FLOAT32, &scale_val), VX_TYPE_SCALAR);
            ASSERT_VX_OBJECT(node = vxMultiplyNode(graph, src1, src2, scale, policy, rounding, dst), VX_TYPE_NODE);
            VX_CALL(vxReplicateNode(graph, node, replicate, 6));
            VX_CALL(vxReleaseScalar(&scale));
            break;
        }

        case LUT:
        {
            vx_uint32 i, k;
            vx_lut lut = 0;
            vx_uint8* data = 0;
            vx_bool replicate[] = { vx_true_e, vx_true_e, vx_true_e };
            vx_map_id map_id;
            ASSERT_VX_OBJECT(lut = vxCreateLUT(context, VX_TYPE_UINT8, 256), VX_TYPE_LUT);
            ASSERT_VX_OBJECT(object_array = vxCreateObjectArray(context, (vx_reference)lut, levels), VX_TYPE_OBJECT_ARRAY);
            VX_CALL(vxReleaseLUT(&lut));

            for (k = 0; k < levels; ++k)
            {
                ASSERT_VX_OBJECT(lut = (vx_lut)vxGetObjectArrayItem(object_array, k), VX_TYPE_LUT);
                VX_CALL(vxMapLUT(lut, &map_id, (void **)&data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
                for (i = 0; i < 256; i++)
                    data[i] = 255 - i - k;
                VX_CALL(vxUnmapLUT(lut, map_id));
                VX_CALL(vxReleaseLUT(&lut));
            }

            ASSERT_VX_OBJECT(lut = (vx_lut)vxGetObjectArrayItem(object_array, 0), VX_TYPE_LUT);
            ASSERT_VX_OBJECT(node = vxTableLookupNode(graph, src1, lut, dst), VX_TYPE_NODE);
            VX_CALL(vxReplicateNode(graph, node, replicate, 3));
            VX_CALL(vxReleaseLUT(&lut));
            break;
        }

        default:
            ASSERT(0);
        }
    }
    else
        ASSERT(0);

    VX_CALL(vxVerifyGraph(graph));
    VX_CALL(vxProcessGraph(graph));

    VX_CALL(vxReleaseImage(&src1));
    VX_CALL(vxReleaseImage(&src2));
    VX_CALL(vxReleaseImage(&dst));

    if (object_array)
        VX_CALL(vxReleaseObjectArray(&object_array));

    VX_CALL(vxReleaseNode(&node));
    VX_CALL(vxReleaseGraph(&graph));

    return;
}

static void check_replicas(vx_reference ref, vx_reference tst, vx_border_t border)
{
    vx_uint32 i;
    vx_size ref_levels = 0;
    vx_size tst_levels = 0;
    vx_enum type = VX_TYPE_INVALID;

    VX_CALL(vxQueryReference(ref, VX_REFERENCE_TYPE, &type, sizeof(type)));

    if (type == VX_TYPE_PYRAMID)
    {
        vx_float32 scale;

        VX_CALL(vxQueryPyramid((vx_pyramid)ref, VX_PYRAMID_SCALE, &scale, sizeof(scale)));
        VX_CALL(vxQueryPyramid((vx_pyramid)ref, VX_PYRAMID_LEVELS, &ref_levels, sizeof(vx_size)));
        VX_CALL(vxQueryPyramid((vx_pyramid)tst, VX_PYRAMID_LEVELS, &tst_levels, sizeof(vx_size)));

        EXPECT_EQ_INT(ref_levels, tst_levels);

        for (i = 0; i < ref_levels; i++)
        {
            vx_image src1 = 0;
            vx_image src2 = 0;
            CT_Image img1 = 0;
            CT_Image img2 = 0;

            ASSERT_VX_OBJECT(src1 = vxGetPyramidLevel((vx_pyramid)ref, i), VX_TYPE_IMAGE);
            ASSERT_VX_OBJECT(src2 = vxGetPyramidLevel((vx_pyramid)tst, i), VX_TYPE_IMAGE);

            ASSERT_NO_FAILURE(img1 = ct_image_from_vx_image(src1));
            ASSERT_NO_FAILURE(img2 = ct_image_from_vx_image(src2));

            if (VX_BORDER_UNDEFINED == border.mode)
            {
                if (i > 0)
                {
                    if (VX_SCALE_PYRAMID_ORB == scale)
                    {
                        ct_adjust_roi(img1, 2, 2, 2, 2);
                        ct_adjust_roi(img2, 2, 2, 2, 2);
                    }
                    else if (VX_SCALE_PYRAMID_HALF == scale)
                    {
                        ct_adjust_roi(img1, 1, 1, 1, 1);
                        ct_adjust_roi(img2, 1, 1, 1, 1);
                    }
                }
            }

            EXPECT_EQ_CTIMAGE(img1, img2);

            VX_CALL(vxReleaseImage(&src1));
            VX_CALL(vxReleaseImage(&src2));
        }
    }
    else if (type == VX_TYPE_OBJECT_ARRAY)
    {
        VX_CALL(vxQueryObjectArray((vx_object_array)ref, VX_OBJECT_ARRAY_NUMITEMS, &ref_levels, sizeof(vx_size)));
        VX_CALL(vxQueryObjectArray((vx_object_array)tst, VX_OBJECT_ARRAY_NUMITEMS, &tst_levels, sizeof(vx_size)));
        EXPECT_EQ_INT(ref_levels, tst_levels);

        for (i = 0; i < ref_levels; i++)
        {
            vx_image src1 = 0;
            vx_image src2 = 0;
            CT_Image img1 = 0;
            CT_Image img2 = 0;

            ASSERT_VX_OBJECT(src1 = (vx_image)vxGetObjectArrayItem((vx_object_array)ref, i), VX_TYPE_IMAGE);
            ASSERT_VX_OBJECT(src2 = (vx_image)vxGetObjectArrayItem((vx_object_array)tst, i), VX_TYPE_IMAGE);

            ASSERT_NO_FAILURE(img1 = ct_image_from_vx_image(src1));
            ASSERT_NO_FAILURE(img2 = ct_image_from_vx_image(src2));
            EXPECT_EQ_CTIMAGE(img1, img2);

            VX_CALL(vxReleaseImage(&src1));
            VX_CALL(vxReleaseImage(&src2));
        }
    }
    else
        ASSERT(0);

    return;
}


TEST_WITH_ARG(Graph, testReplicateNode, Test_Replicate_Arg, TEST_REPLICATE_PARAMETERS)
{
    vx_context context = context_->vx_context_;
    CT_Image src = 0;
    vx_reference src1 = 0;
    vx_reference src2 = 0;
    vx_reference ref = 0;
    vx_reference tst = 0;
    vx_image input1 = 0;
    vx_image input2 = 0;
    vx_pixel_value_t value = {{ 2 }};
    vx_border_t border;

    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));

    if (arg_->scale < 0)
    {
        vx_size i;
        ASSERT_VX_OBJECT(input1 = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);

        ASSERT_VX_OBJECT(src1 = (vx_reference)vxCreateObjectArray(context, (vx_reference)input1, arg_->levels), VX_TYPE_OBJECT_ARRAY);
        ASSERT_VX_OBJECT(src2 = (vx_reference)vxCreateObjectArray(context, (vx_reference)input1, arg_->levels), VX_TYPE_OBJECT_ARRAY);
        ASSERT_VX_OBJECT(ref = (vx_reference)vxCreateObjectArray(context, (vx_reference)input1, arg_->levels), VX_TYPE_OBJECT_ARRAY);
        ASSERT_VX_OBJECT(tst = (vx_reference)vxCreateObjectArray(context, (vx_reference)input1, arg_->levels), VX_TYPE_OBJECT_ARRAY);

        /* Initialize array items */
        for (i = 0; i < arg_->levels; ++i)
        {
            vx_image item = 0;
            value.U8 = (vx_uint8)i;
            ASSERT_VX_OBJECT(input2 = vxCreateUniformImage(context, arg_->width, arg_->height, arg_->format, &value), VX_TYPE_IMAGE);
            ASSERT_VX_OBJECT(item = (vx_image)vxGetObjectArrayItem((vx_object_array)src1, (vx_uint32)i), VX_TYPE_IMAGE);
            VX_CALL(vxuAdd(context, input1, input2, VX_CONVERT_POLICY_WRAP, item));
            VX_CALL(vxReleaseImage(&item));
            VX_CALL(vxReleaseImage(&input2));
        }

        VX_CALL(vxReleaseImage(&input1));
    }
    else
    {
        ASSERT_VX_OBJECT(input1 = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(input2 = vxCreateUniformImage(context, arg_->width, arg_->height, arg_->format, &value), VX_TYPE_IMAGE);

        ASSERT_VX_OBJECT(src1 = (vx_reference)vxCreatePyramid(context, arg_->levels, arg_->scale, arg_->width, arg_->height, arg_->format), VX_TYPE_PYRAMID);
        ASSERT_VX_OBJECT(src2 = (vx_reference)vxCreatePyramid(context, arg_->levels, arg_->scale, arg_->width, arg_->height, arg_->format), VX_TYPE_PYRAMID);
        ASSERT_VX_OBJECT(ref = (vx_reference)vxCreatePyramid(context, arg_->levels, arg_->scale, arg_->width, arg_->height, arg_->format), VX_TYPE_PYRAMID);
        ASSERT_VX_OBJECT(tst = (vx_reference)vxCreatePyramid(context, arg_->levels, arg_->scale, arg_->width, arg_->height, arg_->format), VX_TYPE_PYRAMID);

        /* Initialize pyramids */
        VX_CALL(vxuGaussianPyramid(context, input1, (vx_pyramid)src1));
        VX_CALL(vxuGaussianPyramid(context, input2, (vx_pyramid)src2));

        VX_CALL(vxReleaseImage(&input1));
        VX_CALL(vxReleaseImage(&input2));
    }

    ref_replicate_op(context, src1, src2, ref, arg_->op);
    tst_replicate_op(context, src1, src2, tst, arg_->op);

    VX_CALL(vxQueryContext(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
    check_replicas(ref, tst, border);

    VX_CALL(vxReleaseReference(&src1));
    VX_CALL(vxReleaseReference(&src2));
    VX_CALL(vxReleaseReference(&ref));
    VX_CALL(vxReleaseReference(&tst));
}


static void test_halfscalegaussian(vx_context context)
{
    vx_uint32 nrefs_before = 0;
    vx_uint32 nrefs_after = 0;
    vx_uint32 nrefs_dangling = 0;

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_before, sizeof(nrefs_before)));

    {
        int count;
        vx_image src = 0;
        vx_image dst = 0;
        vx_graph graph = 0;
        vx_node node = 0;

        ASSERT_VX_OBJECT(src = vxCreateImage(context, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(dst = vxCreateImage(context, 160, 120, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
        ASSERT_VX_OBJECT(node = vxHalfScaleGaussianNode(graph, src, dst, 3), VX_TYPE_NODE);

        for (count = 0; count < 2; count++)
        {
            VX_CALL(vxVerifyGraph(graph));
        }

        VX_CALL(vxReleaseImage(&src));
        VX_CALL(vxReleaseImage(&dst));
        VX_CALL(vxReleaseNode(&node));
        VX_CALL(vxReleaseGraph(&graph));
    }

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_after, sizeof(nrefs_after)));

    nrefs_dangling = nrefs_after - nrefs_before;
    ASSERT_EQ_INT(0, nrefs_dangling);

    return;
}


static void test_cannyedgedetector(vx_context context)
{
    vx_uint32 nrefs_before = 0;
    vx_uint32 nrefs_after = 0;
    vx_uint32 nrefs_dangling = 0;
    vx_uint32 nkernels_before = 0;
    vx_uint32 nkernels_after = 0;

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_before, sizeof(nrefs_before)));
    VX_CALL(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, &nkernels_before, sizeof(nkernels_before)));

    {
        vx_image src = 0;
        vx_image dst = 0;
        vx_graph graph = 0;
        vx_threshold threshold = 0;
        vx_int32 val1 = 16;
        vx_int32 val2 = 32;
        vx_node node = 0;

        ASSERT_VX_OBJECT(src = vxCreateImage(context, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(dst = vxCreateImage(context, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(threshold = vxCreateThreshold(context, VX_THRESHOLD_TYPE_RANGE, VX_TYPE_UINT8), VX_TYPE_THRESHOLD);
        VX_CALL(vxSetThresholdAttribute(threshold, VX_THRESHOLD_THRESHOLD_LOWER, &val1, sizeof(val1)));
        VX_CALL(vxSetThresholdAttribute(threshold, VX_THRESHOLD_THRESHOLD_UPPER, &val2, sizeof(val2)));
        ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
        ASSERT_VX_OBJECT(node = vxCannyEdgeDetectorNode(graph, src, threshold, 3, VX_NORM_L1, dst), VX_TYPE_NODE);

        VX_CALL(vxVerifyGraph(graph));

        VX_CALL(vxReleaseImage(&src));
        VX_CALL(vxReleaseImage(&dst));
        VX_CALL(vxReleaseThreshold(&threshold));
        VX_CALL(vxReleaseNode(&node));
        VX_CALL(vxReleaseGraph(&graph));
    }

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_after, sizeof(nrefs_after)));
    VX_CALL(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, &nkernels_after, sizeof(nkernels_after)));

    nrefs_dangling = nrefs_after - nrefs_before;

    if(nkernels_after != nkernels_before)
        nrefs_dangling -= (nkernels_after - nkernels_before);

    ASSERT_EQ_INT(0, nrefs_dangling);

    return;
}


static void test_harriscorners(vx_context context)
{
    vx_uint32 nrefs_before = 0;
    vx_uint32 nrefs_after = 0;
    vx_uint32 nrefs_dangling = 0;
    vx_uint32 nkernels_before = 0;
    vx_uint32 nkernels_after = 0;

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_before, sizeof(nrefs_before)));
    VX_CALL(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, &nkernels_before, sizeof(nkernels_before)));

    {
        vx_image src = 0;
        vx_array dst = 0;
        vx_graph graph = 0;
        vx_size capacity = 1000;
        vx_scalar strength = 0;
        vx_float32 strength_val = 0.5f;
        vx_scalar min_distance = 0;
        vx_float32 min_distance_val = 0.5f;
        vx_scalar sensitivity = 0;
        vx_float32 sensitivity_val = 0.1f;
        vx_scalar num_corners = 0;
        vx_size num_corners_val = 10;
        vx_node node = 0;

        ASSERT_VX_OBJECT(src = vxCreateImage(context, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(dst = vxCreateArray(context, VX_TYPE_KEYPOINT, capacity), VX_TYPE_ARRAY);
        ASSERT_VX_OBJECT(strength = vxCreateScalar(context, VX_TYPE_FLOAT32, &strength_val), VX_TYPE_SCALAR);
        ASSERT_VX_OBJECT(min_distance = vxCreateScalar(context, VX_TYPE_FLOAT32, &min_distance_val), VX_TYPE_SCALAR);
        ASSERT_VX_OBJECT(sensitivity = vxCreateScalar(context, VX_TYPE_FLOAT32, &sensitivity_val), VX_TYPE_SCALAR);
        ASSERT_VX_OBJECT(num_corners = vxCreateScalar(context, VX_TYPE_SIZE, &num_corners_val), VX_TYPE_SCALAR);
        ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
        ASSERT_VX_OBJECT(node = vxHarrisCornersNode(graph, src, strength, min_distance, sensitivity, 3, 3, dst, num_corners), VX_TYPE_NODE);

        VX_CALL(vxVerifyGraph(graph));

        VX_CALL(vxReleaseImage(&src));
        VX_CALL(vxReleaseArray(&dst));
        VX_CALL(vxReleaseScalar(&strength));
        VX_CALL(vxReleaseScalar(&min_distance));
        VX_CALL(vxReleaseScalar(&sensitivity));
        VX_CALL(vxReleaseScalar(&num_corners));
        VX_CALL(vxReleaseNode(&node));
        VX_CALL(vxReleaseGraph(&graph));
    }

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_after, sizeof(nrefs_after)));
    VX_CALL(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, &nkernels_after, sizeof(nkernels_after)));

    nrefs_dangling = nrefs_after - nrefs_before;

    if (nkernels_after != nkernels_before)
        nrefs_dangling -= (nkernels_after - nkernels_before);

    ASSERT_EQ_INT(0, nrefs_dangling);

    return;
}


static void test_gaussianpyramid(vx_context context)
{
    vx_uint32 nrefs_before = 0;
    vx_uint32 nrefs_after = 0;
    vx_uint32 nrefs_dangling = 0;
    vx_uint32 nkernels_before = 0;
    vx_uint32 nkernels_after = 0;

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_before, sizeof(nrefs_before)));
    VX_CALL(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, &nkernels_before, sizeof(nkernels_before)));

    {
        vx_image src = 0;
        vx_pyramid dst = 0;
        vx_size levels = 2;
        vx_float32 scale = VX_SCALE_PYRAMID_HALF;
        vx_graph graph = 0;
        vx_node node = 0;

        ASSERT_VX_OBJECT(src = vxCreateImage(context, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(dst = vxCreatePyramid(context, levels, scale, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_PYRAMID);
        ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
        ASSERT_VX_OBJECT(node = vxGaussianPyramidNode(graph, src, dst), VX_TYPE_NODE);

        VX_CALL(vxVerifyGraph(graph));

        VX_CALL(vxReleaseImage(&src));
        VX_CALL(vxReleasePyramid(&dst));
        VX_CALL(vxReleaseNode(&node));
        VX_CALL(vxReleaseGraph(&graph));
    }

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_after, sizeof(nrefs_after)));
    VX_CALL(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, &nkernels_after, sizeof(nkernels_after)));

    nrefs_dangling = nrefs_after - nrefs_before;

    if (nkernels_after != nkernels_before)
        nrefs_dangling -= (nkernels_after - nkernels_before);

    ASSERT_EQ_INT(0, nrefs_dangling);

    return;
}


static void test_laplacianpyramid(vx_context context)
{
    vx_uint32 nrefs_before = 0;
    vx_uint32 nrefs_after = 0;
    vx_uint32 nrefs_dangling = 0;
    vx_uint32 nkernels_before = 0;
    vx_uint32 nkernels_after = 0;

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_before, sizeof(nrefs_before)));
    VX_CALL(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, &nkernels_before, sizeof(nkernels_before)));

    {
        int count;
        vx_image src = 0;
        vx_image out = 0;
        vx_pyramid dst = 0;
        vx_size levels = 2;
        vx_float32 scale = VX_SCALE_PYRAMID_HALF;
        vx_graph graph = 0;
        vx_node node = 0;

        ASSERT_VX_OBJECT(src = vxCreateImage(context, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(out = vxCreateImage(context, 80, 60, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(dst = vxCreatePyramid(context, levels, scale, 320, 240, VX_DF_IMAGE_S16), VX_TYPE_PYRAMID);
        ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
        ASSERT_VX_OBJECT(node = vxLaplacianPyramidNode(graph, src, dst, out), VX_TYPE_NODE);

        for (count = 0; count < 2; count++)
        {
            VX_CALL(vxVerifyGraph(graph));
        }

        VX_CALL(vxReleaseImage(&src));
        VX_CALL(vxReleaseImage(&out));
        VX_CALL(vxReleasePyramid(&dst));
        VX_CALL(vxReleaseNode(&node));
        VX_CALL(vxReleaseGraph(&graph));
    }

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_after, sizeof(nrefs_after)));
    VX_CALL(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, &nkernels_after, sizeof(nkernels_after)));

    nrefs_dangling = nrefs_after - nrefs_before;

    if (nkernels_after != nkernels_before)
        nrefs_dangling -= (nkernels_after - nkernels_before);

    ASSERT_EQ_INT(0, nrefs_dangling);

    return;
}


static void test_laplacianreconstruct(vx_context context)
{
    vx_uint32 nrefs_before = 0;
    vx_uint32 nrefs_after = 0;
    vx_uint32 nrefs_dangling = 0;
    vx_uint32 nkernels_before = 0;
    vx_uint32 nkernels_after = 0;

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_before, sizeof(nrefs_before)));
    VX_CALL(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, &nkernels_before, sizeof(nkernels_before)));

    {
        int count;
        vx_pyramid src = 0;
        vx_image in = 0;
        vx_image dst = 0;
        vx_size levels = 2;
        vx_float32 scale = VX_SCALE_PYRAMID_HALF;
        vx_graph graph = 0;
        vx_node node = 0;

        ASSERT_VX_OBJECT(src = vxCreatePyramid(context, levels, scale, 320, 240, VX_DF_IMAGE_S16), VX_TYPE_PYRAMID);
        ASSERT_VX_OBJECT(in = vxCreateImage(context, 80, 60, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(dst = vxCreateImage(context, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
        ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
        ASSERT_VX_OBJECT(node = vxLaplacianReconstructNode(graph, src, in, dst), VX_TYPE_NODE);

        for (count = 0; count < 2; count++)
        {
            VX_CALL(vxVerifyGraph(graph));
        }

        VX_CALL(vxReleasePyramid(&src));
        VX_CALL(vxReleaseImage(&in));
        VX_CALL(vxReleaseImage(&dst));
        VX_CALL(vxReleaseNode(&node));
        VX_CALL(vxReleaseGraph(&graph));
    }

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_after, sizeof(nrefs_after)));
    VX_CALL(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, &nkernels_after, sizeof(nkernels_after)));

    nrefs_dangling = nrefs_after - nrefs_before;

    if (nkernels_after != nkernels_before)
        nrefs_dangling -= (nkernels_after - nkernels_before);

    ASSERT_EQ_INT(0, nrefs_dangling);

    return;
}


static void test_opticalflowpyrlk(vx_context context)
{
    vx_uint32 nrefs_before = 0;
    vx_uint32 nrefs_after = 0;
    vx_uint32 nrefs_dangling = 0;

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_before, sizeof(nrefs_before)));

    {
        int count;
        vx_size levels = 2;
        vx_float32 scale = VX_SCALE_PYRAMID_HALF;
        vx_pyramid old_images = 0;
        vx_pyramid new_images = 0;
        vx_size capacity = 1000;
        vx_array old_points = 0;
        vx_array new_points_estimates = 0;
        vx_array new_points = 0;
        vx_graph graph = 0;
        vx_scalar epsilon = 0;
        vx_float32 epsilon_val = 0.5f;
        vx_scalar num_iter = 0;
        vx_uint32 num_iter_val = 5;
        vx_scalar use_initial_estimate = 0;
        vx_bool use_initial_estimate_val = vx_true_e;
        vx_size window_dims = 10;
        vx_node node = 0;

        ASSERT_VX_OBJECT(old_images = vxCreatePyramid(context, levels, scale, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_PYRAMID);
        ASSERT_VX_OBJECT(new_images = vxCreatePyramid(context, levels, scale, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_PYRAMID);
        ASSERT_VX_OBJECT(old_points = vxCreateArray(context, VX_TYPE_KEYPOINT, capacity), VX_TYPE_ARRAY);
        ASSERT_VX_OBJECT(new_points_estimates = vxCreateArray(context, VX_TYPE_KEYPOINT, capacity), VX_TYPE_ARRAY);
        ASSERT_VX_OBJECT(new_points = vxCreateArray(context, VX_TYPE_KEYPOINT, capacity), VX_TYPE_ARRAY);
        ASSERT_VX_OBJECT(epsilon = vxCreateScalar(context, VX_TYPE_FLOAT32, &epsilon_val), VX_TYPE_SCALAR);
        ASSERT_VX_OBJECT(num_iter = vxCreateScalar(context, VX_TYPE_UINT32, &num_iter_val), VX_TYPE_SCALAR);
        ASSERT_VX_OBJECT(use_initial_estimate = vxCreateScalar(context, VX_TYPE_BOOL, &use_initial_estimate_val), VX_TYPE_SCALAR);
        ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
        ASSERT_VX_OBJECT(node = vxOpticalFlowPyrLKNode(graph,
            old_images, new_images,
            old_points, new_points_estimates, new_points,
            VX_TERM_CRITERIA_BOTH, epsilon, num_iter, use_initial_estimate, window_dims), VX_TYPE_NODE);

        for (count = 0; count < 2; count++)
        {
            VX_CALL(vxVerifyGraph(graph));
        }

        VX_CALL(vxReleasePyramid(&old_images));
        VX_CALL(vxReleasePyramid(&new_images));
        VX_CALL(vxReleaseArray(&old_points));
        VX_CALL(vxReleaseArray(&new_points_estimates));
        VX_CALL(vxReleaseArray(&new_points));
        VX_CALL(vxReleaseScalar(&epsilon));
        VX_CALL(vxReleaseScalar(&num_iter));
        VX_CALL(vxReleaseScalar(&use_initial_estimate));
        VX_CALL(vxReleaseNode(&node));
        VX_CALL(vxReleaseGraph(&graph));
    }

    VX_CALL(vxQueryContext(context, VX_CONTEXT_REFERENCES, &nrefs_after, sizeof(nrefs_after)));

    nrefs_dangling = nrefs_after - nrefs_before;
    ASSERT_EQ_INT(0, nrefs_dangling);

    return;
}


typedef enum
{
    fn_vxOpticalFlowPyrLKNode = 0,
    fn_vxGaussianPyramidNode,
    fn_vxCannyEdgeDetectorNode,
    fn_vxHarrisCornersNode,
    fn_vxHalfScaleGaussianNode,
    fn_vxLaplacianPyramidNode,
    fn_vxLaplacianReconstructNode

}  test_case;


typedef struct
{
    const char* testName;
    CT_Image(*generator)(const char* fileName, int width, int height);
    test_case test_id;

} ResourceLeakage_Arg;


#define ADD_TEST_CASES(testArgName, nextmacro, ...) \
    CT_EXPAND(nextmacro(testArgName "/vxOpticalFlowPyrLKNode",     __VA_ARGS__, fn_vxOpticalFlowPyrLKNode)), \
    CT_EXPAND(nextmacro(testArgName "/vxGaussianPyramidNode",      __VA_ARGS__, fn_vxGaussianPyramidNode)), \
    CT_EXPAND(nextmacro(testArgName "/vxCannyEdgeDetectorNode",    __VA_ARGS__, fn_vxCannyEdgeDetectorNode)), \
    CT_EXPAND(nextmacro(testArgName "/vxHarrisCornersNode",        __VA_ARGS__, fn_vxHarrisCornersNode)), \
    CT_EXPAND(nextmacro(testArgName "/vxHalfScaleGausianNode",     __VA_ARGS__, fn_vxHalfScaleGaussianNode)), \
    CT_EXPAND(nextmacro(testArgName "/vxLaplacianPyramidNode",     __VA_ARGS__, fn_vxLaplacianPyramidNode)), \
    CT_EXPAND(nextmacro(testArgName "/vxLaplacianReconstructNode", __VA_ARGS__, fn_vxLaplacianReconstructNode))

#define RESOURCE_LEAKAGE_PARAMETERS \
    CT_GENERATE_PARAMETERS("func", ADD_TEST_CASES, ARG, NULL)

TEST_WITH_ARG(Graph, testVerifyGraphLeak, ResourceLeakage_Arg, RESOURCE_LEAKAGE_PARAMETERS)
{
    vx_context context = context_->vx_context_;

    switch (arg_->test_id)
    {
    case fn_vxOpticalFlowPyrLKNode:     test_opticalflowpyrlk(context); break;
    case fn_vxGaussianPyramidNode:      test_gaussianpyramid(context);  break;
    case fn_vxCannyEdgeDetectorNode:    test_cannyedgedetector(context); break;
    case fn_vxHarrisCornersNode:        test_harriscorners(context); break;
    case fn_vxHalfScaleGaussianNode:    test_halfscalegaussian(context); break;
    case fn_vxLaplacianPyramidNode:     test_laplacianpyramid(context); break;
    case fn_vxLaplacianReconstructNode: test_laplacianreconstruct(context); break;
    default: break;
    }
    return;
}


static vx_graph graph_to_abandon = NULL;
static vx_status saved_graph_state_status = VX_FAILURE;
static vx_bool saved_graph_state_queried = vx_false_e;
static vx_enum saved_graph_state = VX_GRAPH_STATE_UNVERIFIED;

static vx_action VX_CALLBACK abandon_graph(vx_node node)
{
    vx_action action = VX_ACTION_ABANDON;

    if (graph_to_abandon != NULL)
    {
        saved_graph_state_status = vxQueryGraph(graph_to_abandon, VX_GRAPH_STATE, &saved_graph_state, sizeof(saved_graph_state));
        saved_graph_state_queried = vx_true_e;
    }

    return action;
}

TEST(Graph, testGraphState)
{
    vx_context context = context_->vx_context_;
    vx_image src_image = 0, interm_image = 0, dst_image = 0;
    vx_graph graph = 0;
    vx_node node1 = 0, node2 = 0;
    vx_enum graph_state = VX_GRAPH_STATE_UNVERIFIED;
    int phase;

    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);

    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);

    VX_CALL(vxQueryGraph(graph, VX_GRAPH_STATE, &graph_state, sizeof(graph_state)));
    ASSERT(graph_state == VX_GRAPH_STATE_UNVERIFIED);

    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);

    VX_CALL(vxQueryGraph(graph, VX_GRAPH_STATE, &graph_state, sizeof(graph_state)));
    ASSERT(graph_state == VX_GRAPH_STATE_UNVERIFIED);

    VX_CALL(vxVerifyGraph(graph));

    VX_CALL(vxQueryGraph(graph, VX_GRAPH_STATE, &graph_state, sizeof(graph_state)));
    ASSERT(graph_state == VX_GRAPH_STATE_VERIFIED);

    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst_image), VX_TYPE_NODE);

    VX_CALL(vxQueryGraph(graph, VX_GRAPH_STATE, &graph_state, sizeof(graph_state)));
    ASSERT(graph_state == VX_GRAPH_STATE_UNVERIFIED);

    VX_CALL(vxVerifyGraph(graph));

    VX_CALL(vxQueryGraph(graph, VX_GRAPH_STATE, &graph_state, sizeof(graph_state)));
    ASSERT(graph_state == VX_GRAPH_STATE_VERIFIED);

    for (phase = 0; phase < 2; ++phase)
    {
        vx_bool do_async = (vx_bool)(phase != 0);

        if (do_async)
        {
            VX_CALL(vxScheduleGraph(graph));
            VX_CALL(vxWaitGraph(graph));
        }
        else
        {
            VX_CALL(vxProcessGraph(graph));
        }

        VX_CALL(vxQueryGraph(graph, VX_GRAPH_STATE, &graph_state, sizeof(graph_state)));
        ASSERT(graph_state == VX_GRAPH_STATE_COMPLETED);

        graph_to_abandon = graph;
        saved_graph_state_status = VX_FAILURE;
        saved_graph_state_queried = vx_false_e;
        saved_graph_state = VX_GRAPH_STATE_UNVERIFIED;

        VX_CALL(vxAssignNodeCallback(node1, &abandon_graph));

        if (do_async)
        {
            VX_CALL(vxScheduleGraph(graph));
            ASSERT_EQ_VX_STATUS(VX_ERROR_GRAPH_ABANDONED, vxWaitGraph(graph));
        }
        else
        {
            ASSERT_EQ_VX_STATUS(VX_ERROR_GRAPH_ABANDONED, vxProcessGraph(graph));
        }

        ASSERT(saved_graph_state_queried == vx_true_e);
        ASSERT_EQ_VX_STATUS(VX_SUCCESS, saved_graph_state_status);
        ASSERT(saved_graph_state == VX_GRAPH_STATE_RUNNING);

        VX_CALL(vxQueryGraph(graph, VX_GRAPH_STATE, &graph_state, sizeof(graph_state)));
        ASSERT(graph_state == VX_GRAPH_STATE_ABANDONED);

        VX_CALL(vxAssignNodeCallback(node1, NULL));
    }

    VX_CALL(vxReleaseNode(&node1));
    VX_CALL(vxReleaseNode(&node2));
    VX_CALL(vxReleaseGraph(&graph));
    VX_CALL(vxReleaseImage(&dst_image));
    VX_CALL(vxReleaseImage(&interm_image));
    VX_CALL(vxReleaseImage(&src_image));

    ASSERT(node1 == 0); ASSERT(node2 == 0);
    ASSERT(graph == 0);
    ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
}


TESTCASE_TESTS(Graph,
        testTwoNodes,
        testGraphFactory,
        testVirtualImage,
        testVirtualArray,
        testNodeRemove,
        testNodeFromEnum,
        testTwoNodesWithSameDst,
        testCycle,
        testCycle2,
        testMultipleRun,
        testMultipleRunAsync,
        DISABLED_testAsyncWaitWithoutSchedule,
        testNodePerformance,
        testGraphPerformance,
        testKernelName,
        testAllocateUserKernelId,
        testAllocateUserKernelLibraryId,
        testReplicateNode,
        testImageContainmentRelationship,
        testVerifyGraphLeak,
        testGraphState
        )
