151c0b2f7Stbbdev /*
2b15aabb3Stbbdev     Copyright (c) 2020-2021 Intel Corporation
351c0b2f7Stbbdev 
451c0b2f7Stbbdev     Licensed under the Apache License, Version 2.0 (the "License");
551c0b2f7Stbbdev     you may not use this file except in compliance with the License.
651c0b2f7Stbbdev     You may obtain a copy of the License at
751c0b2f7Stbbdev 
851c0b2f7Stbbdev         http://www.apache.org/licenses/LICENSE-2.0
951c0b2f7Stbbdev 
1051c0b2f7Stbbdev     Unless required by applicable law or agreed to in writing, software
1151c0b2f7Stbbdev     distributed under the License is distributed on an "AS IS" BASIS,
1251c0b2f7Stbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351c0b2f7Stbbdev     See the License for the specific language governing permissions and
1451c0b2f7Stbbdev     limitations under the License.
1551c0b2f7Stbbdev */
1651c0b2f7Stbbdev 
17b15aabb3Stbbdev #if __INTEL_COMPILER && _MSC_VER
18b15aabb3Stbbdev #pragma warning(disable : 2586) // decorated name length exceeded, name was truncated
19b15aabb3Stbbdev #endif
2051c0b2f7Stbbdev 
21*de0109beSIlya Mishin #define CONFORMANCE_BUFFERING_NODES
22*de0109beSIlya Mishin #define CONFORMANCE_OVERWRITE_NODE
2351c0b2f7Stbbdev 
2451c0b2f7Stbbdev #include "conformance_flowgraph.h"
2551c0b2f7Stbbdev 
2651c0b2f7Stbbdev //! \file conformance_overwrite_node.cpp
2751c0b2f7Stbbdev //! \brief Test for [flow_graph.overwrite_node] specification
2851c0b2f7Stbbdev 
2951c0b2f7Stbbdev //! Test overwrite_node behavior
3051c0b2f7Stbbdev //! \brief \ref requirement
3151c0b2f7Stbbdev TEST_CASE("overwrite_node messages"){
32*de0109beSIlya Mishin     oneapi::tbb::flow::graph g;
33*de0109beSIlya Mishin 
34*de0109beSIlya Mishin     oneapi::tbb::flow::overwrite_node<int> testing_node(g);
35*de0109beSIlya Mishin 
36*de0109beSIlya Mishin     int tmp = -1;
37*de0109beSIlya Mishin     testing_node.try_put(1);
38*de0109beSIlya Mishin     g.wait_for_all();
39*de0109beSIlya Mishin 
40*de0109beSIlya Mishin     CHECK_MESSAGE((testing_node.try_get(tmp) == true), "Descendant needs to receive a message");
41*de0109beSIlya Mishin     CHECK_MESSAGE((tmp == 1), "Descendant needs to receive a correct value");
42*de0109beSIlya Mishin 
43*de0109beSIlya Mishin     testing_node.try_put(2);
44*de0109beSIlya Mishin     g.wait_for_all();
45*de0109beSIlya Mishin 
46*de0109beSIlya Mishin     CHECK_MESSAGE((testing_node.try_get(tmp) == true), "Descendant needs to receive a message");
47*de0109beSIlya Mishin     CHECK_MESSAGE((tmp == 2), "Descendant needs to receive a correct value");
4851c0b2f7Stbbdev }
4951c0b2f7Stbbdev 
5051c0b2f7Stbbdev //! Test function_node broadcast
5151c0b2f7Stbbdev //! \brief \ref requirement
5251c0b2f7Stbbdev TEST_CASE("overwrite_node broadcast"){
53*de0109beSIlya Mishin     conformance::test_forwarding<oneapi::tbb::flow::overwrite_node<int>, int>(1);
5451c0b2f7Stbbdev }
5551c0b2f7Stbbdev 
5651c0b2f7Stbbdev //! Test function_node buffering
5751c0b2f7Stbbdev //! \brief \ref requirement
5851c0b2f7Stbbdev TEST_CASE("overwrite_node buffering"){
59*de0109beSIlya Mishin     conformance::test_buffering<oneapi::tbb::flow::overwrite_node<int>, int>();
6051c0b2f7Stbbdev }
6151c0b2f7Stbbdev 
62*de0109beSIlya Mishin //! The node that is constructed has a reference to the same graph object as src,with an invalid internal buffer item.
63*de0109beSIlya Mishin //! The buffered value and list of successors are not copied from src.
64*de0109beSIlya Mishin //! \brief \ref requirement
6551c0b2f7Stbbdev TEST_CASE("overwrite_node copy constructor"){
66*de0109beSIlya Mishin     conformance::test_copy_ctor_for_buffering_nodes<oneapi::tbb::flow::overwrite_node<int>>();
6751c0b2f7Stbbdev }
6851c0b2f7Stbbdev 
6951c0b2f7Stbbdev //! Test inheritance relations
7051c0b2f7Stbbdev //! \brief \ref interface
7151c0b2f7Stbbdev TEST_CASE("overwrite_node superclasses"){
72*de0109beSIlya Mishin     conformance::test_inheritance<oneapi::tbb::flow::overwrite_node<int>, int, int>();
73*de0109beSIlya Mishin     conformance::test_inheritance<oneapi::tbb::flow::overwrite_node<void*>, void*, void*>();
74*de0109beSIlya Mishin }
75*de0109beSIlya Mishin 
76*de0109beSIlya Mishin //! Test overwrite_node node constructor
77*de0109beSIlya Mishin //! \brief \ref requirement
78*de0109beSIlya Mishin TEST_CASE("overwrite_node constructor"){
79*de0109beSIlya Mishin     oneapi::tbb::flow::graph g;
80*de0109beSIlya Mishin     oneapi::tbb::flow::overwrite_node<int> testing_node(g);
81*de0109beSIlya Mishin 
82*de0109beSIlya Mishin     int tmp = -1;
83*de0109beSIlya Mishin     CHECK_MESSAGE((!testing_node.is_valid()), "Constructed node has invalid internal buffer item");
84*de0109beSIlya Mishin     CHECK_MESSAGE((!testing_node.try_get(tmp)), "Gets from the node are non-destructive, but the first `try_get' fails");
85*de0109beSIlya Mishin }
86*de0109beSIlya Mishin 
87*de0109beSIlya Mishin //! Test overwrite_node node `is_valid()` and `clear()`
88*de0109beSIlya Mishin //! \brief \ref requirement
89*de0109beSIlya Mishin TEST_CASE("overwrite_node methods"){
90*de0109beSIlya Mishin     oneapi::tbb::flow::graph g;
91*de0109beSIlya Mishin     oneapi::tbb::flow::overwrite_node<int> testing_node(g);
92*de0109beSIlya Mishin 
93*de0109beSIlya Mishin     CHECK_MESSAGE((!testing_node.is_valid()), "Constructed node has invalid internal buffer item");
94*de0109beSIlya Mishin 
95*de0109beSIlya Mishin     testing_node.try_put(1);
96*de0109beSIlya Mishin 
97*de0109beSIlya Mishin     CHECK_MESSAGE((testing_node.is_valid()), "Buffer must be valid after try_put call");
98*de0109beSIlya Mishin 
99*de0109beSIlya Mishin     testing_node.clear();
100*de0109beSIlya Mishin 
101*de0109beSIlya Mishin     CHECK_MESSAGE((!testing_node.is_valid()), "call `clear` invalidates the value held in the buffer.");
102*de0109beSIlya Mishin }
103*de0109beSIlya Mishin 
104*de0109beSIlya Mishin //! The following test shows the possibility to connect the node to a reserving join_node,
105*de0109beSIlya Mishin //! avoiding direct calls to the try_get() method from the body of the successor node
106*de0109beSIlya Mishin //! \brief \ref requirement
107*de0109beSIlya Mishin TEST_CASE("overwrite_node with reserving join_node as successor"){
108*de0109beSIlya Mishin     conformance::test_with_reserving_join_node_class<oneapi::tbb::flow::overwrite_node<int>>();
10951c0b2f7Stbbdev }
110