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