1c8b59c046895fa5b6d79f73e0b5817330fcfbfc1A. Unique TensorFlower/* Copyright 2015 The TensorFlow Authors. All Rights Reserved. 29c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur 39c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurLicensed under the Apache License, Version 2.0 (the "License"); 49c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudluryou may not use this file except in compliance with the License. 59c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurYou may obtain a copy of the License at 69c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur 79c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur http://www.apache.org/licenses/LICENSE-2.0 89c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur 99c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurUnless required by applicable law or agreed to in writing, software 109c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlurdistributed under the License is distributed on an "AS IS" BASIS, 119c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 129c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurSee the License for the specific language governing permissions and 139c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlurlimitations under the License. 149c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur==============================================================================*/ 159c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur 16f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/framework/node_def_builder.h" 17f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 18f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <memory> 19b481783fe0e00a86f6feb20a8dcad5fc4fc936a4Josh Levenberg#include <vector> 20f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/framework/fake_input.h" 21f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/framework/node_def_util.h" 22f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/framework/op_def_builder.h" 23f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/framework/op_def_util.h" 24f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/lib/core/status_test_util.h" 2556313def004795f75ef8281a0294c958d28f1e06Vijay Vasudevan#include "tensorflow/core/platform/protobuf.h" 26c8eaac926c929e07ac8db69f67803a2223ff2d93Josh Levenberg#include "tensorflow/core/platform/test.h" 27f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 28f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace tensorflow { 29f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace { 30f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 31f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurclass NodeDefBuilderTest : public ::testing::Test { 32f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur protected: 33f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Specify an OpDef via an OpDefBuilder. 34f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur void Op(const OpDefBuilder& op_def_builder) { 3572cd0b00ebfa766dbb3e499fd06eb45ecb5b1df3A. Unique TensorFlower OpRegistrationData op_reg_data; 3672cd0b00ebfa766dbb3e499fd06eb45ecb5b1df3A. Unique TensorFlower TF_EXPECT_OK(op_def_builder.Finalize(&op_reg_data)); 3772cd0b00ebfa766dbb3e499fd06eb45ecb5b1df3A. Unique TensorFlower op_def_ = op_reg_data.op_def; 38f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 39f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 40f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Resets builder_ with a new NodeDefBuilder using the Op from the last call 41f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // to Op() above. 42f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur NodeDefBuilder& Builder() { 43f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_FALSE(op_def_.name().empty()) << "Must call Op() before Builder()"; 44f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur builder_.reset(new NodeDefBuilder("n", &op_def_)); 45f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return *builder_; 46f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 47f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 48f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Calls Finalize() and verifies it returns success and the result matches 49f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // expectations. 50f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur void ExpectSuccess(const NodeDefBuilder& builder, 51f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur DataTypeSlice expected_in_types, 52f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur DataTypeSlice expected_out_types, StringPiece proto) { 53f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur NodeDef node_def; 54f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Status status = builder.Finalize(&node_def); 55c3c27f275f94af6e32ecaff66a6bf439abdaff5bVijay Vasudevan TF_EXPECT_OK(status); 56f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (!status.ok()) return; 57f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur NodeDef expected; 58f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur protobuf::TextFormat::ParseFromString(strings::StrCat("name: 'n' ", proto), 59f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur &expected); 60f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(node_def.DebugString(), expected.DebugString()); 61f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 62f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur DataTypeVector in_types, out_types; 63f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur status = 64f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur InOutTypesForNode(node_def, builder.op_def(), &in_types, &out_types); 65c3c27f275f94af6e32ecaff66a6bf439abdaff5bVijay Vasudevan TF_EXPECT_OK(status); 66f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (!status.ok()) return; 67f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(DataTypeSliceString(expected_in_types), 68f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur DataTypeVectorString(in_types)); 69f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_EQ(DataTypeSliceString(expected_out_types), 70f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur DataTypeVectorString(out_types)); 71f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 72f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur status = ValidateNodeDef(node_def, op_def_); 73c3c27f275f94af6e32ecaff66a6bf439abdaff5bVijay Vasudevan TF_EXPECT_OK(status); 74f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 75f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 76f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Calls Finalize() and verifies it returns an error. 77f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Each message must appear as a substring of the error. 78f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur void ExpectFailures(const NodeDefBuilder& builder, 79f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const std::vector<string>& messages) { 80f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur NodeDef node_def; 81f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Status status = builder.Finalize(&node_def); 82f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_FALSE(status.ok()) << SummarizeNodeDef(node_def); 83f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (status.ok()) return; 84f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (const string& message : messages) { 85f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_TRUE(StringPiece(status.error_message()).contains(message)) 86f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur << status << ", " << message; 87f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 88f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 89f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 90f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Calls Finalize() and verifies it returns an error. 91f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Message must appear as a substring of the error. 92f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur void ExpectFailure(const NodeDefBuilder& builder, const string& message) { 93f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailures(builder, {message}); 94f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 95f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 96f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Like ExpectFailure(), except that the error can come from 97f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // ValidateNodeDef(). 98f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur void ExpectInvalid(const NodeDefBuilder& builder, const string& message) { 99f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur NodeDef node_def; 100f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Status status = builder.Finalize(&node_def); 101f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (status.ok()) { 102f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur status = ValidateNodeDef(node_def, op_def_); 103f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 104f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_FALSE(status.ok()) << SummarizeNodeDef(node_def); 105f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (status.ok()) return; 106f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EXPECT_TRUE(StringPiece(status.error_message()).contains(message)) 107f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur << "Actual error: " << status.error_message() 108f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur << "\nDoes not contain: " << message; 109f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 110f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 111f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur OpDef op_def_; 112f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::unique_ptr<NodeDefBuilder> builder_; 113f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}; 114f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 115f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, Simple) { 116f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("Simple").Input("a: int32").Output("out: float")); 117f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 118f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input("x", 0, DT_INT32), {DT_INT32}, {DT_FLOAT}, 119f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( op: "Simple" input: "x" )proto"); 120f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 121f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Port != 0 122f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input("y", 2, DT_INT32), {DT_INT32}, {DT_FLOAT}, 123f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( op: "Simple" input: "y:2" )proto"); 124f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 125f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // FakeInput 126f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput()), {DT_INT32}, {DT_FLOAT}, R"proto( 127f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Simple" input: "a" )proto"); 128f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 129f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(DT_INT32)), {DT_INT32}, {DT_FLOAT}, 130f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( op: "Simple" input: "a" )proto"); 131f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 132f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Ref input 133f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(DT_INT32_REF)), {DT_INT32}, 134f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_FLOAT}, R"proto( op: "Simple" input: "a" )proto"); 135f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 136f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // ControlInput 137f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess( 138f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().ControlInput("x").Input(FakeInput()).ControlInput("y"), 139f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32}, {DT_FLOAT}, R"proto( 140f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Simple" input: ["a", "^x", "^y"] )proto"); 141f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 142f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Device 143f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput()).Device("ddd"), {DT_INT32}, 144f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_FLOAT}, R"proto( 145f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Simple" input: "a" device: "ddd" )proto"); 146f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 147f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Extra input 148f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input("x", 0, DT_INT32).Input("y", 0, DT_INT32), 149f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "More Input() calls than the 1 input_args while building " 150f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "NodeDef 'n' using Op<name=Simple; signature=a:int32 -> " 151f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "out:float>"); 152f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 153f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Missing input 154f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder(), "0 inputs specified of 1 inputs in Op while"); 155f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 156f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur { // Finalize() twice. 157f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur NodeDefBuilder& builder = Builder(); 158bc225bfaa534acc25047fe844f19edc333b7a76aPeter Hawkins // First call to Finalize() 159bc225bfaa534acc25047fe844f19edc333b7a76aPeter Hawkins TF_EXPECT_OK(builder.Input(FakeInput()).Finalize(nullptr)); 160f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // ExpectSuccess() also calls Finalize(). 161f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(builder, {DT_INT32}, {DT_FLOAT}, R"proto( 162f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Simple" input: "a" )proto"); 163f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 164f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 165f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur { // Input() after Finalize() 166f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur NodeDefBuilder& builder = Builder(); 167f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Calling Finalize() before enough inputs -> error. 168f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(builder, "0 inputs specified of 1 inputs in Op while"); 169f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur builder.Input(FakeInput()); 170f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Calling Finalize() with enough inputs -> success 171f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(builder, {DT_INT32}, {DT_FLOAT}, R"proto( 172f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Simple" input: "a" )proto"); 173f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Calling Finalize() with too many inputs -> error. 174f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur builder.Input(FakeInput(DT_INT32)); 175f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(builder, "More Input() calls than the 1 input_args while"); 176f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 177f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 178f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Wrong input type 179f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input("x", 0, DT_FLOAT), 180f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Input 'a' passed float expected int32 "); 181f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 182f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input("x", 0, DT_FLOAT_REF), 183f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Input 'a' passed float_ref expected int32 "); 184f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 185f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // List input 186f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input(FakeInput(3, DT_FLOAT)), 187f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "List provided to input 'a' when single Tensor expected while"); 188f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 189f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input(FakeInput(3)), 190f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "List provided to input 'a' when single Tensor expected while"); 191f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 192f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Bad ControlInput 193f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Input(FakeInput()).ControlInput("z:2"), 194f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Control input '^z:2' must not have ':' in NodeDef:"); 195f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 196f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Bad input name 197f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input("", 0, DT_INT32), 198f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Empty input node name while"); 199f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 200f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input("^x", 0, DT_INT32), 201f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Non-control input starting with ^: ^x while"); 202f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 203f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 204f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, OpDoesNotExist) { 205f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur NodeDefBuilder builder("n", "Op Does Not Exist"); 206f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur builder.Input(FakeInput()) 207f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input(FakeInput(12)) 208f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .ControlInput("y") 209f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("foo", 12) 210f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Device("device"); 2111390dd68fe5f2f83138e19a86b6699254ad38734Vijay Vasudevan ExpectFailures(builder, {"Op type not registered 'Op Does Not Exist'", 2121390dd68fe5f2f83138e19a86b6699254ad38734Vijay Vasudevan "while building NodeDef 'n'"}); 213f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 214f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 215f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, Polymorphic) { 216f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("Polymorphic") 217f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("v: T") 218f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Output("out: T") 219f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: type")); 220f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 221f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(DT_INT32)), {DT_INT32}, {DT_INT32}, 222f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 223f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Polymorphic" input: "a" 224f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_INT32 } } )proto"); 225f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 226f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(DT_FLOAT)), {DT_FLOAT}, {DT_FLOAT}, 227f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 228f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Polymorphic" input: "a" 229f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_FLOAT } } )proto"); 230f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 231f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Redundant Attr() 232f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(DT_BOOL)).Attr("T", DT_BOOL), 233f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_BOOL}, {DT_BOOL}, R"proto( 234f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Polymorphic" input: "a" 235f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_BOOL } } )proto"); 236f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 237f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Conficting Attr() 238f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input(FakeInput(DT_BOOL)).Attr("T", DT_STRING), 239f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'T' DT_BOOL vs. DT_STRING while"); 240f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 241f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Attr("T", DT_STRING).Input(FakeInput(DT_BOOL)), 242f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'T' DT_STRING vs. DT_BOOL while"); 243f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 244f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Attr("T", 12).Input(FakeInput(DT_BOOL)), 245f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'T' 12 vs. DT_BOOL while"); 246f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 247f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 248f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, PolymorphicOut) { 249f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("PolymorphicOut").Output("out: T").Attr("T: type")); 250f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 251f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("T", DT_INT32), {}, {DT_INT32}, R"proto( 252f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "PolymorphicOut" 253f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_INT32 } } )proto"); 254f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 255f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("T", DT_FLOAT), {}, {DT_FLOAT}, R"proto( 256f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "PolymorphicOut" 257f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_FLOAT } } )proto"); 258f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 259f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Redundant attr 260f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("T", DT_FLOAT).Attr("T", DT_FLOAT), {}, 261f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_FLOAT}, R"proto( 262f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "PolymorphicOut" 263f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_FLOAT } } )proto"); 264f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 265f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Conflicting attr 266f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Attr("T", DT_BOOL).Attr("T", DT_FLOAT), 267f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'T' DT_BOOL vs. DT_FLOAT while"); 268f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 269f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Missing attr 270f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder(), "NodeDef missing attr 'T' from"); 271f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 272f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Attr has the wrong type 273f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan ExpectInvalid( 274f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan Builder().Attr("T", {DT_INT32, DT_BOOL}), 275f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan "AttrValue had value with type 'list(type)' when 'type' expected"); 276f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 277f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("T", 12), 278f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan "AttrValue had value with type 'int' when 'type' expected"); 279f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 280f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 281f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, PolymorphicDefaultOut) { 282f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("PolymorphicDefaultOut") 283f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Output("out: T") 284f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: type = DT_STRING")); 285f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 286f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder(), {}, {DT_STRING}, R"proto( 287f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "PolymorphicDefaultOut" 288f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_STRING } } )proto"); 289f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 290f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("T", DT_BOOL), {}, {DT_BOOL}, R"proto( 291f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "PolymorphicDefaultOut" 292f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_BOOL } } )proto"); 293f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 294f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 295f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, Binary) { 296f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("Binary").Input("a: T").Input("b: T").Output("out: T").Attr( 297f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "T: type")); 298f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 299f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(DT_INT32)).Input(FakeInput(DT_INT32)), 300f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32, DT_INT32}, {DT_INT32}, R"proto( 301f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Binary" input: "a" input: "b" 302f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_INT32 } } )proto"); 303f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 304f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(DT_STRING)).Input(FakeInput()), 305f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_STRING, DT_STRING}, {DT_STRING}, R"proto( 306f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Binary" input: "a" input: "b" 307f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_STRING } } )proto"); 308f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 309f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Type mismatch 310f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input(FakeInput(DT_BOOL)).Input(FakeInput(DT_STRING)), 311f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'T' DT_BOOL vs. DT_STRING while"); 312f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 313f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 314f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, Restrict) { 315f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("Restrict") 316f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("a: T") 317f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Output("out: T") 318f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: {string, bool}")); 319f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(DT_STRING)), {DT_STRING}, {DT_STRING}, 320f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 321f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Restrict" input: "a" 322f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_STRING } } )proto"); 323f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 324f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Input(FakeInput(DT_INT32)), 325f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 'T' of int32 is not in the list of allowed " 326f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "values: string, bool"); 327f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 328f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 329f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, TypeList) { 330f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("TypeList").Input("a: T").Attr("T: list(type)")); 331f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 332f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput({DT_STRING, DT_INT32})), 333f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_STRING, DT_INT32}, {}, R"proto( 334f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "TypeList" input: ["a", "a:1"] 335f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { list { type: [DT_STRING, DT_INT32] } } } 336f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur )proto"); 337f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 338f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(3, DT_BOOL)), 339f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_BOOL, DT_BOOL, DT_BOOL}, {}, R"proto( 340f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "TypeList" input: ["a", "a:1", "a:2"] 341f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { list { type: [DT_BOOL, DT_BOOL, DT_BOOL] } } } 342f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur )proto"); 343f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 344f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Input(FakeInput(0)), 345f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Length for attr 'T' of 0 must be at least minimum 1"); 346f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 347f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Input(FakeInput({})), 348f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Length for attr 'T' of 0 must be at least minimum 1"); 349f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 350f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Input(FakeInput(DT_BOOL)), 351f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Single tensor passed to 'a', expected list while"); 352f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 353f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailures(Builder().Input(FakeInput()), 354f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {"2 errors while building NodeDef", 355f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Could not infer list of types for input 'a': " 356f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "No attr named 'T' in NodeDef:", 357f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "0 inputs specified of 1 inputs in Op"}); 358f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 359f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 360f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, TypeListNoMin) { 361f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("TypeListNoMin").Input("a: T").Attr("T: list(type) >= 0")); 362f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 363f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(0)), {}, {}, R"proto( 364f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "TypeListNoMin" attr { key: "T" value { list { } } } )proto"); 365f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 366f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(DataTypeVector())), {}, {}, R"proto( 367f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "TypeListNoMin" attr { key: "T" value { list { } } } )proto"); 368f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 369f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput({})), {}, {}, R"proto( 370f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "TypeListNoMin" attr { key: "T" value { list { } } } )proto"); 371f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 372f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput({DT_BOOL})), {DT_BOOL}, {}, R"proto( 373f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "TypeListNoMin" input: "a" 374f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { list { type: DT_BOOL } } } )proto"); 375f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 376f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 377f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, TypeListTwice) { 378f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("TypeListTwice") 379f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("a: T") 380f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("b: T") 381f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: list(type) >= 0")); 382f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 383f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder() 384f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input(FakeInput({DT_INT32, DT_BOOL})) 385f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input(FakeInput({DT_INT32, DT_BOOL})), 386f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32, DT_BOOL, DT_INT32, DT_BOOL}, {}, R"proto( 387f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "TypeListTwice" input: ["a", "a:1", "b", "b:1"] 388f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { list { type: [DT_INT32, DT_BOOL] } } } )proto"); 389f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 390f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess( 391f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput({DT_INT32, DT_BOOL})).Input(FakeInput()), 392f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32, DT_BOOL, DT_INT32, DT_BOOL}, {}, R"proto( 393f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "TypeListTwice" input: ["a", "a:1", "b", "b:1"] 394f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { list { type: [DT_INT32, DT_BOOL] } } } )proto"); 395f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 396f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(0)).Input(FakeInput(0)), {}, {}, 397f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 398f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "TypeListTwice" attr { key: "T" value { list { } } } )proto"); 399f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 400f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(0)).Input(FakeInput()), {}, {}, 401f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 402f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "TypeListTwice" attr { key: "T" value { list { } } } )proto"); 403f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 404f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder() 405f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input(FakeInput({DT_INT32, DT_BOOL})) 406f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input(FakeInput({DT_INT32, DT_STRING})), 407f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'T' [DT_INT32, DT_BOOL] vs. " 408f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "[DT_INT32, DT_STRING] while"); 409f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 410f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 411f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, OutTypeList) { 412f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("OutTypeList").Output("out: T").Attr("T: list(type) >= 0")); 413f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 414f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("T", {DT_FLOAT}), {}, {DT_FLOAT}, R"proto( 415f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "OutTypeList" 416f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { list { type: DT_FLOAT } } } )proto"); 417f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 418f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("T", {DT_STRING, DT_BOOL}), {}, 419f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_STRING, DT_BOOL}, R"proto( 420f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "OutTypeList" 421f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { list { type: [DT_STRING, DT_BOOL] } } } )proto"); 422f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 423f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("T", DataTypeVector()), {}, {}, R"proto( 424f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "OutTypeList" 425f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { list { } } } )proto"); 426f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 427f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan ExpectInvalid( 428f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan Builder().Attr("T", DT_FLOAT), 429f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan "AttrValue had value with type 'type' when 'list(type)' expected"); 430f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 431f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 432f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, TypeListRestrict) { 433f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("TypeListRestrict") 434f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("a: T") 435f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: list({string, bool}) >= 0")); 436f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 437f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput({DT_STRING, DT_BOOL})), 438f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_STRING, DT_BOOL}, {}, R"proto( 439f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "TypeListRestrict" input: ["a", "a:1"] 440f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { list { type: [DT_STRING, DT_BOOL] } } } )proto"); 441f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 442f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Input(FakeInput({DT_STRING, DT_INT32})), 443f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 'T' of int32 is not in the list of allowed " 444f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "values: string, bool"); 445f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 446f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 447f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, OutTypeListRestrict) { 448f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("OutTypeListRestrict") 449f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Output("out: t") 450f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("t: list({string, bool}) >= 0")); 451f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 452f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("t", {DT_BOOL, DT_STRING}), {}, 453f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_BOOL, DT_STRING}, R"proto( 454f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "OutTypeListRestrict" 455f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "t" value { list { type: [DT_BOOL, DT_STRING] } } } )proto"); 456f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 457f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("t", {DT_STRING, DT_INT32}), 458f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 't' of int32 is not in the list of allowed " 459f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "values: string, bool"); 460f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 461f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 462f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, Attr) { 463f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("Attr").Attr("a: int")); 464f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 465f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", 12), {}, {}, R"proto( 466f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "Attr" attr { key: "a" value { i: 12 } } )proto"); 467f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 468f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Attr has wrong type 469f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("a", "bad"), 470f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan "AttrValue had value with type 'string' when 'int' expected"); 471f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 472f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan ExpectInvalid( 473f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan Builder().Attr("a", {12}), 474f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan "AttrValue had value with type 'list(int)' when 'int' expected"); 475f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 476f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Missing attr 477f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder(), "NodeDef missing attr 'a' from Op<"); 478f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 479f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Wrong attr 480f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("b", 12), 481f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "NodeDef mentions attr 'b' not in Op<"); 482f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 483f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Extra attr 484f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("a", 12).Attr("extra", 12), 485f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "NodeDef mentions attr 'extra' not in Op<"); 486f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 487f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 488f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, AttrFloat) { 489f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrFloat").Attr("a: float")); 490f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 491f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", 1.2f /* float */), {}, {}, R"proto( 492f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrFloat" attr { key: "a" value { f: 1.2 } } 493f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur )proto"); 494f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 495f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", 1.2 /* double */), {}, {}, R"proto( 496f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrFloat" attr { key: "a" value { f: 1.2 } } 497f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur )proto"); 498f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 499f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Won't automatically cast int to float 500f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("a", 12), 501f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan "AttrValue had value with type 'int' when 'float' expected"); 502f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 503f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 504f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, AttrBoolList) { 505f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrBoolList").Attr("a: list(bool)")); 506f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 507f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", {true, false, true}), {}, {}, R"proto( 508f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrBoolList" 509f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { list { b: [true, false, true] } } } 510f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur )proto"); 511f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 512f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", std::vector<bool>()), {}, {}, R"proto( 513f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrBoolList" attr { key: "a" value { list { } } } 514f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur )proto"); 515f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 516f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Won't cast int -> bool. 517f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("a", {0}), 518f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan "AttrValue had value with type 'list(int)' when 'list(bool)' " 519f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "expected"); 520f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 521f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 522f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, AttrMin) { 523f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrMin").Attr("a: int >= 5")); 524f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 525f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", 12), {}, {}, R"proto( 526f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrMin" attr { key: "a" value { i: 12 } } )proto"); 527f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 528f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("a", 2), 529f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 'a' of 2 must be at least minimum 5"); 530f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 531f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 532f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, AttrListMin) { 533f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrListMin").Attr("a: list(int) >= 2")); 534f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 535f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", {1, 2}), {}, {}, R"proto( 536f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrListMin" 537f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { list { i: [1, 2] } } } )proto"); 538f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 539f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("a", {17}), 540f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Length for attr 'a' of 1 must be at least minimum 2"); 541f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 542f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 543f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, AttrEnum) { 544f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrEnum").Attr("a: {'apples', 'oranges'}")); 545f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 546f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", "oranges"), {}, {}, R"proto( 547f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrEnum" 548f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { s: "oranges" } } )proto"); 549f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 550f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid( 551f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Attr("a", "invalid"), 552f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 'a' of \"invalid\" is not in the list of allowed values: " 553f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "\"apples\", \"oranges\""); 554f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 555f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 556f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, AttrEnumList) { 557f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrEnumList").Attr("a: list({'apples', 'oranges'})")); 558f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 559f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", {"oranges", "apples"}), {}, {}, R"proto( 560f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrEnumList" 561f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { list { s: ["oranges", "apples"] } } } )proto"); 562f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 563f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid( 564f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Attr("a", {"apples", "invalid", "oranges"}), 565f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 'a' of \"invalid\" is not in the list of allowed values: " 566f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "\"apples\", \"oranges\""); 567f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 568f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 569f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, AttrShape) { 570f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrShape").Attr("a: shape")); 571f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 572f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", TensorShape({5})), {}, {}, R"proto( 573f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrShape" 574f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { shape { dim { size: 5 } } } } )proto"); 575f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 576f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", TensorShape({4, 3, 2})), {}, {}, R"proto( 577f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrShape" 578f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { shape { 579f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur dim { size: 4 } dim { size: 3 } dim { size: 2 } } } } )proto"); 580f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 581f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", TensorShape({3, 2})), {}, {}, 582f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 583f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrShape" 584f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { shape { 585f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur dim { size: 3 } dim { size: 2 } } } } )proto"); 586f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 587f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", TensorShape()), {}, {}, R"proto( 588f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrShape" 589f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { shape { } } } )proto"); 590f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 591f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 592f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, AttrDefault) { 593f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrDefault").Attr("a: string = 'banana'")); 594f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 595f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder(), {}, {}, R"proto( 596f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrDefault" 597f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { s: "banana" } } )proto"); 598f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 599f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", "kiwi"), {}, {}, R"proto( 600f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrDefault" 601f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { s: "kiwi" } } )proto"); 602f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 603f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 604f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, AttrManyDefault) { 605f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrManyDefault") 606f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("a: string = 'banana'") 607f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("b: string = 'kiwi'")); 608f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 609f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder(), {}, {}, R"proto( 610f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrManyDefault" 611f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { s: "banana" } } 612f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "b" value { s: "kiwi" } } )proto"); 613f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 614f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrManyDefaultWithMandatory") 615f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("a: string = 'banana'") 616f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("b: string = 'kiwi'") 617f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("c: string")); 618f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 619f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("c", "strawberry"), {}, {}, R"proto( 620f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrManyDefaultWithMandatory" 621f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "c" value { s: "strawberry" } } 622f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { s: "banana" } } 623f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "b" value { s: "kiwi" } } )proto"); 624f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 625f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrManyDefaultAndInferred") 626f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("input: T") 627f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: {float, double}") 628f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("a: string") 629f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("b: list(string) >= 1") 630f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("c: bool = true") 631f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("d: float = 0.3") 632f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("e: string") 633f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("f: float = 0.25")); 634f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 635f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder() 636f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input(FakeInput(DT_FLOAT)) 637f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("a", "foo") 638f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("e", "foo") 639f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("b", std::vector<string>({"bar", "baz"})) 640f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("f", 1.0f), 641f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_FLOAT}, {}, R"proto( 642f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrManyDefaultAndInferred" 643f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur input: "a" 644f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_FLOAT } } 645f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { s: "foo" } } 646f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "e" value { s: "foo" } } 647f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "b" value { list { s: "bar" s: "baz" } } } 648f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "f" value { f: 1.0 } } 649f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "c" value { b: true } } 650f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "d" value { f: 0.3 } } )proto"); 651f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 652f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 653f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, AttrListDefault) { 654f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrListDefault").Attr("a: list(int) = [5, 15]")); 655f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 656f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder(), {}, {}, R"proto( 657f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrListDefault" 658f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { list { i: [5, 15] } } } )proto"); 659f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 660f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", {3}), {}, {}, R"proto( 661f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrListDefault" 662f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { list { i: 3 } } } )proto"); 663f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 664f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", std::vector<int>()), {}, {}, R"proto( 665f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrListDefault" 666f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { list { } } } )proto"); 667f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 668f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 669f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, AttrEmptyListDefault) { 670f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("AttrEmptyListDefault").Attr("a: list(int) = []")); 671f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 672f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder(), {}, {}, R"proto( 673f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrEmptyListDefault" 674f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { list { } } } )proto"); 675f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 676f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", {3}), {}, {}, R"proto( 677f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrEmptyListDefault" 678f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { list { i: 3 } } } )proto"); 679f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 680f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("a", std::vector<int>()), {}, {}, R"proto( 681f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "AttrEmptyListDefault" 682f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "a" value { list { } } } )proto"); 683f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 684f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 685f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, NIntsIn) { 686f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("NIntsIn").Input("a: N*int32").Attr("N: int >= 2")); 687f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 688f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(2)), {DT_INT32, DT_INT32}, {}, 689f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 690f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NIntsIn" input: ["a", "a:1"] 691f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } )proto"); 692f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 693f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(5, DT_INT32)), 694f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32, DT_INT32, DT_INT32, DT_INT32, DT_INT32}, {}, R"proto( 695f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NIntsIn" 696f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur input: ["a", "a:1", "a:2", "a:3", "a:4"] 697f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 5 } } )proto"); 698f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 699f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailures(Builder().Input(FakeInput(2, DT_STRING)), 700f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {"2 errors while building NodeDef", 701f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Input 'a' passed string expected int32"}); 702f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 703f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Input(FakeInput(1)), 704f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 'N' of 1 must be at least minimum 2"); 705f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 706f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailures( 707f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput(DT_INT32)), 708f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {"2 errors while building NodeDef", 709f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Could not infer length of input 'a': No attr named 'N' in NodeDef:", 710f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "0 inputs specified of 1 inputs in Op"}); 711f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 712f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input({{"in", 0, DT_INT32}, {"in", 1, DT_STRING}}), 713f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Input 'a' passed string expected int32 while"); 714f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 715f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailures( 716f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput()), 717f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {"2 errors while building NodeDef", 718f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Could not infer length of input 'a': No attr named 'N' in NodeDef:", 719f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "0 inputs specified of 1 inputs in Op"}); 720f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 721f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 722f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, NPolymorphicIn) { 723f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("NPolymorphicIn") 724f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("a: N*T") 725f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: type") 726f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("N: int >= 2")); 727f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 728f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(2, DT_INT32)), {DT_INT32, DT_INT32}, 729f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {}, R"proto( 730f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NPolymorphicIn" input: ["a", "a:1"] 731f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } 732f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_INT32 } } )proto"); 733f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 734f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(3, DT_STRING)), 735f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_STRING, DT_STRING, DT_STRING}, {}, R"proto( 736f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NPolymorphicIn" 737f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur input: ["a", "a:1", "a:2"] 738f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 3 } } 739f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_STRING } } )proto"); 740f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 741f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailures( 742f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput(2)), 743f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {"2 errors while building NodeDef", 744f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Could not infer type for input 'a': No attr named 'T' in NodeDef:", 745f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "0 inputs specified of 1 inputs in Op"}); 746f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 747f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input(FakeInput({DT_INT32, DT_STRING})), 748f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Input 'a' passed string expected int32 while"); 749f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 750f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input({{"in", 0, DT_INT32}, {"in", 1, DT_STRING}}), 751f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Input 'a' passed string expected int32 while"); 752f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 753f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Input(FakeInput(1, DT_INT32)), 754f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 'N' of 1 must be at least minimum 2"); 755f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 756f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input("in", 0, DT_INT32), 757f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Single tensor passed to 'a', expected list while"); 758f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 759f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 760f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, NPolymorphicRestrictIn) { 761f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("NPolymorphicRestrictIn") 762f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("a: N*T") 763f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: {string, bool}") 764f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("N: int >= 2")); 765f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 766f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(2, DT_BOOL)), {DT_BOOL, DT_BOOL}, {}, 767f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 768f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NPolymorphicRestrictIn" input: ["a", "a:1"] 769f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } 770f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_BOOL } } )proto"); 771f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 772f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(3, DT_STRING)), 773f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_STRING, DT_STRING, DT_STRING}, {}, R"proto( 774f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NPolymorphicRestrictIn" 775f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur input: ["a", "a:1", "a:2"] 776f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 3 } } 777f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_STRING } } )proto"); 778f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 779f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Input(FakeInput(2, DT_INT32)), 780f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 'T' of int32 is not in the list of allowed " 781f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "values: string, bool"); 782f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 783f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 784f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, NInTwice) { 785f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("NInTwice") 786f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("a: N*int32") 787f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("b: N*string") 788f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("N: int >= 0")); 789f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 790f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(2)).Input(FakeInput(2)), 791f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32, DT_INT32, DT_STRING, DT_STRING}, {}, R"proto( 792f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NInTwice" 793f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur input: ["a", "a:1", "b", "b:1"] 794f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } )proto"); 795f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 796f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(0)).Input(FakeInput()), {}, {}, 797f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 798f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NInTwice" attr { key: "N" value { i: 0 } } )proto"); 799f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 800f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input(FakeInput(3)).Input(FakeInput(1)), 801f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'N' 3 vs. 1 while"); 802f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 803f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 804f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, NInPolymorphicTwice) { 805f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("NInPolymorphicTwice") 806f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("a: N*T") 807f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("b: N*T") 808f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: type") 809f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("N: int >= 0")); 810f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 811f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(2, DT_INT32)).Input(FakeInput()), 812f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32, DT_INT32, DT_INT32, DT_INT32}, {}, R"proto( 813f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NInPolymorphicTwice" 814f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur input: ["a", "a:1", "b", "b:1"] 815f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } 816f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_INT32 } } )proto"); 817f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 818f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure( 819f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput(3, DT_INT32)).Input(FakeInput(1, DT_INT32)), 820f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'N' 3 vs. 1 while"); 821f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 822f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input(FakeInput(3, DT_INT32)).Input(FakeInput(1)), 823f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'N' 3 vs. 1 while"); 824f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 825f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure( 826f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput(2, DT_INT32)).Input(FakeInput(2, DT_STRING)), 827f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'T' DT_INT32 vs. DT_STRING while"); 828f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 829f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure( 830f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput(2, DT_INT32)).Input(FakeInput(DT_STRING)), 831f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'T' DT_INT32 vs. DT_STRING while"); 832f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 833f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 834f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, NInTwoTypeVariables) { 835f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("NInTwoTypeVariables") 836f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("a: N*S") 837f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("b: N*T") 838f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("S: type") 839f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: type") 840f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("N: int >= 0")); 841f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 842f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess( 843f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput(2, DT_INT32)).Input(FakeInput(2, DT_BOOL)), 844f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32, DT_INT32, DT_BOOL, DT_BOOL}, {}, R"proto( 845f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NInTwoTypeVariables" 846f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur input: ["a", "a:1", "b", "b:1"] 847f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } 848f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "S" value { type: DT_INT32 } } 849f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_BOOL } } )proto"); 850f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 851f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess( 852f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput(2, DT_INT32)).Input(FakeInput(DT_BOOL)), 853f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32, DT_INT32, DT_BOOL, DT_BOOL}, {}, R"proto( 854f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NInTwoTypeVariables" 855f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur input: ["a", "a:1", "b", "b:1"] 856f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } 857f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "S" value { type: DT_INT32 } } 858f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_BOOL } } )proto"); 859f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 860f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure( 861f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput(3, DT_INT32)).Input(FakeInput(1, DT_STRING)), 862f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'N' 3 vs. 1 while"); 863f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 864f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 865f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, InPolymorphicTwice) { 866f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("InPolymorphicTwice") 867f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("a: N*T") 868f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Input("b: M*T") 869f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: type") 870f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("N: int >= 0") 871f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("M: int >= 0")); 872f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 873f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess( 874f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput(1, DT_INT32)).Input(FakeInput(3, DT_INT32)), 875f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32, DT_INT32, DT_INT32, DT_INT32}, {}, R"proto( 876f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "InPolymorphicTwice" 877f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur input: ["a", "b", "b:1", "b:2"] 878f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 1 } } 879f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_INT32 } } 880f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "M" value { i: 3 } } )proto"); 881f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 882f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(1, DT_BOOL)).Input(FakeInput(0)), 883f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_BOOL}, {}, R"proto( 884f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "InPolymorphicTwice" input: "a" 885f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 1 } } 886f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_BOOL } } 887f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "M" value { i: 0 } } )proto"); 888f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 889f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(0)).Input(FakeInput(1, DT_BOOL)), 890f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_BOOL}, {}, R"proto( 891f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "InPolymorphicTwice" input: "b" 892f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 0 } } 893f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "M" value { i: 1 } } 894f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_BOOL } } )proto"); 895f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 896f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure( 897f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Builder().Input(FakeInput(2, DT_INT32)).Input(FakeInput(2, DT_STRING)), 898f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Inconsistent values for attr 'T' DT_INT32 vs. DT_STRING while"); 899f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 900f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 901f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, NIntsOut) { 902f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("NIntsOut").Output("a: N*int32").Attr("N: int >= 2")); 903f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 904f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("N", 2), {}, {DT_INT32, DT_INT32}, R"proto( 905f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NIntsOut" 906f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } )proto"); 907f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 908f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("N", 3), {}, {DT_INT32, DT_INT32, DT_INT32}, 909f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 910f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NIntsOut" 911f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 3 } } )proto"); 912f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 913f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("N", 1), 914f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 'N' of 1 must be at least minimum 2"); 915f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 916f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan ExpectInvalid( 917f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan Builder().Attr("N", {3}), 918f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan "AttrValue had value with type 'list(int)' when 'int' expected"); 919f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 920f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder(), "NodeDef missing attr 'N' from"); 921f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 922f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 923f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, NIntsOutDefault) { 924f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("NIntsOutDefault") 925f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Output("a: N*int32") 926f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("N: int >= 2 = 3")); 927f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 928f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder(), {}, {DT_INT32, DT_INT32, DT_INT32}, R"proto( 929f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NIntsOutDefault" 930f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 3 } } )proto"); 931f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 932f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("N", 2), {}, {DT_INT32, DT_INT32}, R"proto( 933f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NIntsOutDefault" 934f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } )proto"); 935f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 936f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 937f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, NPolymorphicOut) { 938f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("NPolymorphicOut") 939f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Output("a: N*T") 940f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: type") 941f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("N: int >= 2")); 942f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 943f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("T", DT_INT32).Attr("N", 2), {}, 944f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32, DT_INT32}, R"proto( 945f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NPolymorphicOut" 946f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_INT32 } } 947f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } )proto"); 948f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 949f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("N", 3).Attr("T", DT_STRING), {}, 950f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_STRING, DT_STRING, DT_STRING}, R"proto( 951f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NPolymorphicOut" 952f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 3 } } 953f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_STRING } } )proto"); 954f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 955f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("N", 1).Attr("T", DT_STRING), 956f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 'N' of 1 must be at least minimum 2"); 957f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 958f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan ExpectInvalid( 959f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan Builder().Attr("N", 3).Attr("T", {DT_STRING}), 960f2102f4e2c1c87f1d1bf9ab856a2849c54478760Vijay Vasudevan "AttrValue had value with type 'list(type)' when 'type' expected"); 961f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 962f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 963f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, NPolymorphicOutDefault) { 964f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("NPolymorphicOutDefault") 965f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Output("a: N*T") 966f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: type = DT_BOOL") 967f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("N: int >= 2 = 2")); 968f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 969f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder(), {}, {DT_BOOL, DT_BOOL}, R"proto( 970f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NPolymorphicOutDefault" 971f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_BOOL } } 972f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } )proto"); 973f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 974f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("N", 3), {}, {DT_BOOL, DT_BOOL, DT_BOOL}, 975f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 976f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NPolymorphicOutDefault" 977f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 3 } } 978f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_BOOL } } )proto"); 979f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 980f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("T", DT_INT32), {}, {DT_INT32, DT_INT32}, 981f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 982f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NPolymorphicOutDefault" 983f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_INT32 } } 984f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 2 } } )proto"); 985f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 986f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("N", 3).Attr("T", DT_INT32), {}, 987f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_INT32, DT_INT32, DT_INT32}, R"proto( 988f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NPolymorphicOutDefault" 989f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 3 } } 990f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_INT32 } } )proto"); 991f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 992f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 993f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, NPolymorphicRestrictOut) { 994f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("NPolymorphicRestrictOut") 995f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Output("a: N*T") 996f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("T: {string, bool}") 997f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur .Attr("N: int >= 2")); 998f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 999f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("N", 3).Attr("T", DT_BOOL), {}, 1000f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur {DT_BOOL, DT_BOOL, DT_BOOL}, R"proto( 1001f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "NPolymorphicRestrictOut" 1002f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "N" value { i: 3 } } 1003f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_BOOL } } )proto"); 1004f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1005f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectInvalid(Builder().Attr("N", 3).Attr("T", DT_INT32), 1006f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Value for attr 'T' of int32 is not in the list of allowed " 1007f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "values: string, bool"); 1008f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 1009f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1010f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, RefIn) { 1011f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("RefIn").Input("a: Ref(int32)")); 1012f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1013f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(DT_INT32_REF)), {DT_INT32_REF}, {}, 1014f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 1015f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "RefIn" input: "a" )proto"); 1016f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1017f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input(FakeInput(DT_BOOL_REF)), 1018f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Input 'a' passed bool_ref expected int32_ref while"); 1019f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1020f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input(FakeInput(DT_INT32)), 1021f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Input 'a' passed int32 expected int32_ref while"); 1022f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 1023f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1024f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, PolymorphicRefIn) { 1025f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("PolymorphicRefIn").Input("a: Ref(T)").Attr("T: type")); 1026f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1027f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Input(FakeInput(DT_BOOL_REF)), {DT_BOOL_REF}, {}, 1028f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur R"proto( 1029f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "PolymorphicRefIn" input: "a" 1030f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "T" value { type: DT_BOOL } } )proto"); 1031f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1032f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectFailure(Builder().Input(FakeInput(DT_BOOL)), 1033f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur "Input 'a' passed bool expected ref type while"); 1034f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 1035f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1036f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, RefOut) { 1037f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("RefOut").Output("a: Ref(string)")); 1038f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1039f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder(), {}, {DT_STRING_REF}, R"proto( 1040f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "RefOut" )proto"); 1041f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 1042f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1043f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, PolymorphicRefOut) { 1044f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("PolymorphicRefOut").Output("a: Ref(t)").Attr("t: type")); 1045f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1046f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Attr("t", DT_BOOL), {}, {DT_BOOL_REF}, R"proto( 1047f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "PolymorphicRefOut" 1048f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur attr { key: "t" value { type: DT_BOOL } } )proto"); 1049f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 1050f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1051f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath KudlurTEST_F(NodeDefBuilderTest, SpecifyDevice) { 1052f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Op(OpDefBuilder("SpecifyDevice")); 1053f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1054f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ExpectSuccess(Builder().Device("ADevice"), {}, {}, R"proto( 1055f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur op: "SpecifyDevice" device: "ADevice" )proto"); 1056f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 1057f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 1058f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} // namespace 1059f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} // namespace tensorflow 1060