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_write_once_node.cpp
2751c0b2f7Stbbdev //! \brief Test for [flow_graph.write_once_node] specification
2851c0b2f7Stbbdev 
2951c0b2f7Stbbdev //! Test function_node broadcast
3051c0b2f7Stbbdev //! \brief \ref requirement
31*de0109beSIlya Mishin TEST_CASE("write_once_node broadcast"){
32*de0109beSIlya Mishin     conformance::test_forwarding<oneapi::tbb::flow::write_once_node<int>, int>(1);
3351c0b2f7Stbbdev }
3451c0b2f7Stbbdev 
3551c0b2f7Stbbdev //! Test write_once_node buffering
3651c0b2f7Stbbdev //! \brief \ref requirement
3751c0b2f7Stbbdev TEST_CASE("write_once_node buffering"){
38*de0109beSIlya Mishin     conformance::test_buffering<oneapi::tbb::flow::write_once_node<int>, int>();
3951c0b2f7Stbbdev }
4051c0b2f7Stbbdev 
41*de0109beSIlya Mishin //! The node that is constructed has a reference to the same graph object as src,with an invalid internal buffer item.
42*de0109beSIlya Mishin //! The buffered value and list of successors are not copied from src.
43*de0109beSIlya Mishin //! \brief \ref requirement
4451c0b2f7Stbbdev TEST_CASE("write_once_node copy constructor"){
45*de0109beSIlya Mishin     conformance::test_copy_ctor_for_buffering_nodes<oneapi::tbb::flow::write_once_node<int>>();
4651c0b2f7Stbbdev }
4751c0b2f7Stbbdev 
4851c0b2f7Stbbdev //! Test inheritance relations
4951c0b2f7Stbbdev //! \brief \ref interface
5051c0b2f7Stbbdev TEST_CASE("write_once_node superclasses"){
51*de0109beSIlya Mishin     conformance::test_inheritance<oneapi::tbb::flow::write_once_node<int>, int, int>();
52*de0109beSIlya Mishin     conformance::test_inheritance<oneapi::tbb::flow::write_once_node<void*>, void*, void*>();
5351c0b2f7Stbbdev }
5451c0b2f7Stbbdev 
55*de0109beSIlya Mishin //! Test overwrite_node node constructor
56*de0109beSIlya Mishin //! \brief \ref requirement
57*de0109beSIlya Mishin TEST_CASE("write_once_node constructor"){
58*de0109beSIlya Mishin     oneapi::tbb::flow::graph g;
59*de0109beSIlya Mishin     oneapi::tbb::flow::overwrite_node<int> testing_node(g);
60*de0109beSIlya Mishin 
61*de0109beSIlya Mishin     int tmp = -1;
62*de0109beSIlya Mishin     CHECK_MESSAGE((!testing_node.is_valid()), "Constructed node has invalid internal buffer item");
63*de0109beSIlya Mishin     CHECK_MESSAGE((!testing_node.try_get(tmp)), "Gets from the node are non-destructive, but the first `try_get' fails");
64*de0109beSIlya Mishin }
65*de0109beSIlya Mishin 
66*de0109beSIlya Mishin //! Test write_once_node node `is_valid()` and `clear()`
67*de0109beSIlya Mishin //! \brief \ref requirement
68*de0109beSIlya Mishin TEST_CASE("write_once_node methods"){
69*de0109beSIlya Mishin     oneapi::tbb::flow::graph g;
70*de0109beSIlya Mishin     oneapi::tbb::flow::write_once_node<int> testing_node(g);
71*de0109beSIlya Mishin 
72*de0109beSIlya Mishin     CHECK_MESSAGE((!testing_node.is_valid()), "Constructed node has invalid internal buffer item");
73*de0109beSIlya Mishin 
74*de0109beSIlya Mishin     testing_node.try_put(1);
75*de0109beSIlya Mishin 
76*de0109beSIlya Mishin     CHECK_MESSAGE((testing_node.is_valid()), "Buffer must be valid after try_put call");
77*de0109beSIlya Mishin 
78*de0109beSIlya Mishin     testing_node.clear();
79*de0109beSIlya Mishin 
80*de0109beSIlya Mishin     CHECK_MESSAGE((!testing_node.is_valid()), "call `clear` invalidates the value held in the buffer.");
81*de0109beSIlya Mishin }
82*de0109beSIlya Mishin 
83*de0109beSIlya Mishin //! The following test shows the possibility to connect the node to a reserving join_node,
84*de0109beSIlya Mishin //! avoiding direct calls to the try_get() method from the body of the successor node
85*de0109beSIlya Mishin //! \brief \ref requirement
86*de0109beSIlya Mishin TEST_CASE("write_once_node with reserving join_node as successor"){
87*de0109beSIlya Mishin     conformance::test_with_reserving_join_node_class<oneapi::tbb::flow::write_once_node<int>>();
88*de0109beSIlya Mishin }
89