// Copyright 2014 The Cobalt Authors. 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/cssom/transform_function_visitor.h"

#include "cobalt/cssom/length_value.h"
#include "cobalt/cssom/matrix_function.h"
#include "cobalt/cssom/number_value.h"
#include "cobalt/cssom/rotate_function.h"
#include "cobalt/cssom/scale_function.h"
#include "cobalt/cssom/translate_function.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace cssom {

class MockTransformFunctionVisitor : public TransformFunctionVisitor {
 public:
  MOCK_METHOD1(VisitMatrix, void(const MatrixFunction* matrix_function));
  MOCK_METHOD1(VisitRotate, void(const RotateFunction* rotate_function));
  MOCK_METHOD1(VisitScale, void(const ScaleFunction* scale_function));
  MOCK_METHOD1(VisitTranslate,
               void(const TranslateFunction* translate_function));
};

TEST(TransformFunctionVisitorTest, VisitsMatrixFunction) {
  MatrixFunction matrix_function(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
  MockTransformFunctionVisitor mock_visitor;
  EXPECT_CALL(mock_visitor, VisitMatrix(&matrix_function));
  matrix_function.Accept(&mock_visitor);
}

TEST(TransformFunctionVisitorTest, VisitsRotateFunction) {
  RotateFunction rotate_function(1.0f);
  MockTransformFunctionVisitor mock_visitor;
  EXPECT_CALL(mock_visitor, VisitRotate(&rotate_function));
  rotate_function.Accept(&mock_visitor);
}

TEST(TransformFunctionVisitorTest, VisitsScaleFunction) {
  ScaleFunction scale_function(2, 2);
  MockTransformFunctionVisitor mock_visitor;
  EXPECT_CALL(mock_visitor, VisitScale(&scale_function));
  scale_function.Accept(&mock_visitor);
}

TEST(TransformFunctionVisitorTest, VisitsTranslateXFunction) {
  TranslateFunction translate_function(
      TranslateFunction::kXAxis, new LengthValue(0, kPixelsUnit));
  MockTransformFunctionVisitor mock_visitor;
  EXPECT_CALL(mock_visitor, VisitTranslate(&translate_function));
  translate_function.Accept(&mock_visitor);
}

}  // namespace cssom
}  // namespace cobalt
