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