/*
 * 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 <algorithm>

#include "cobalt/dom/blob.h"
#include "cobalt/dom/data_view.h"
#include "cobalt/script/testing/mock_exception_state.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace dom {
namespace {

using script::testing::MockExceptionState;
using testing::_;
using testing::SaveArg;
using testing::StrictMock;

TEST(BlobTest, Constructors) {
  scoped_refptr<Blob> blob_default_buffer = new Blob(NULL);

  EXPECT_EQ(0, blob_default_buffer->size());

  StrictMock<MockExceptionState> exception_state;
  scoped_refptr<ArrayBuffer> array_buffer = new ArrayBuffer(NULL, 5);
  scoped_refptr<DataView> data_view =
      new DataView(array_buffer, &exception_state);
  data_view->SetInt16(0, static_cast<int16>(0x0607), &exception_state);

  scoped_refptr<Blob> blob_with_buffer = new Blob(NULL, array_buffer);

  ASSERT_EQ(5, blob_with_buffer->size());
  ASSERT_TRUE(blob_with_buffer->data());

  EXPECT_EQ(0x6, blob_with_buffer->data()[0]);
  EXPECT_EQ(0x7, blob_with_buffer->data()[1]);
  EXPECT_EQ(0, blob_with_buffer->data()[2]);
  EXPECT_EQ(0, blob_with_buffer->data()[3]);
  EXPECT_EQ(0, blob_with_buffer->data()[4]);
}

// Tests that further changes to a buffer from which a blob was constructed
// no longer affect the blob's buffer, since it must be a separate copy of
// its construction arguments.
TEST(BlobTest, HasOwnBuffer) {
  StrictMock<MockExceptionState> exception_state;
  scoped_refptr<ArrayBuffer> array_buffer = new ArrayBuffer(NULL, 2);
  scoped_refptr<DataView> data_view =
      new DataView(array_buffer, &exception_state);
  data_view->SetInt16(0, static_cast<int16>(0x0607), &exception_state);

  scoped_refptr<Blob> blob_with_buffer = new Blob(NULL, array_buffer);

  ASSERT_EQ(2, blob_with_buffer->size());
  ASSERT_TRUE(blob_with_buffer->data());
  EXPECT_NE(array_buffer->data(), blob_with_buffer->data());

  data_view->SetUint8(1, static_cast<uint8>(0xff), &exception_state);

  EXPECT_EQ(0x6, blob_with_buffer->data()[0]);
  EXPECT_EQ(0x7, blob_with_buffer->data()[1]);
}

}  // namespace
}  // namespace dom
}  // namespace cobalt
