/*
 * Copyright 2016 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "cobalt/bindings/testing/bindings_test_base.h"
#include "cobalt/bindings/testing/interface_with_unsupported_properties.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

using ::testing::Return;

namespace cobalt {
namespace bindings {
namespace testing {

namespace {
typedef BindingsTestBase UnsupportedInterfaceTest;
typedef InterfaceBindingsTest<InterfaceWithUnsupportedProperties>
    InterfaceWithUnsupportedPropertiesTest;
}  // namespace

// Current unsupported property detection causes these to incorrectly reporting
// that these properties exist.
TEST_F(InterfaceWithUnsupportedPropertiesTest,
       DISABLED_DoesNotHaveUnsupportedProperty) {
  std::string result;

  EXPECT_TRUE(EvaluateScript("\"unsupportedAttribute\" in test;", &result));
  EXPECT_STREQ("false", result.c_str());

  EXPECT_TRUE(EvaluateScript("\"unsupportedOperation\" in test;", &result));
  EXPECT_STREQ("false", result.c_str());

  EXPECT_TRUE(EvaluateScript("\"UNSUPPORTED_CONSTANT\" in test;", &result));
  EXPECT_STREQ("false", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("\"UNSUPPORTED_CONSTANT\" in test.constructor;", &result));
  EXPECT_STREQ("false", result.c_str());

  EXPECT_TRUE(EvaluateScript("\"supportedAttribute\" in test;", &result));
  EXPECT_STREQ("true", result.c_str());
}

TEST_F(UnsupportedInterfaceTest, InterfaceObjectDoesNotExist) {
  std::string result;
  EXPECT_TRUE(EvaluateScript("\"UnsupportedInterface\" in this;", &result));
  EXPECT_STREQ("false", result.c_str());
}

}  // namespace testing
}  // namespace bindings
}  // namespace cobalt
