// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_TEST_LAYER_TREE_PIXEL_RESOURCE_TEST_H_
#define CC_TEST_LAYER_TREE_PIXEL_RESOURCE_TEST_H_

#include "base/memory/ref_counted.h"
#include "cc/test/layer_tree_pixel_test.h"

namespace cc {

enum PixelResourceTestCase {
  SOFTWARE,
  GPU,
  ONE_COPY,
  ZERO_COPY,
  SKIA_GL,
};

class LayerTreeHostPixelResourceTest : public LayerTreePixelTest {
 public:
  explicit LayerTreeHostPixelResourceTest(PixelResourceTestCase test_case,
                                          Layer::LayerMaskType mask_type);
  LayerTreeHostPixelResourceTest();

  std::unique_ptr<RasterBufferProvider> CreateRasterBufferProvider(
      LayerTreeHostImpl* host_impl) override;

  void RunPixelResourceTest(scoped_refptr<Layer> content_root,
                            base::FilePath file_name);
  void RunPixelResourceTest(scoped_refptr<Layer> content_root,
                            const SkBitmap& expected_bitmap);

  void RunPixelResourceTestWithLayerList(scoped_refptr<Layer> root_layer,
                                         base::FilePath file_name,
                                         PropertyTrees* property_trees);

 protected:
  PixelResourceTestCase test_case_;
  Layer::LayerMaskType mask_type_;
  bool initialized_ = false;

  void InitializeFromTestCase(PixelResourceTestCase test_case);
};

#define INSTANTIATE_PIXEL_RESOURCE_TEST_SUITE_P(framework_name)        \
  INSTANTIATE_TEST_SUITE_P(                                            \
      PixelResourceTest, framework_name,                               \
      ::testing::Combine(                                              \
          ::testing::Values(SOFTWARE, GPU, ONE_COPY, ZERO_COPY),       \
          ::testing::Values(Layer::LayerMaskType::SINGLE_TEXTURE_MASK, \
                            Layer::LayerMaskType::MULTI_TEXTURE_MASK)))

class ParameterizedPixelResourceTest
    : public LayerTreeHostPixelResourceTest,
      public ::testing::WithParamInterface<
          ::testing::tuple<PixelResourceTestCase, Layer::LayerMaskType>> {
 public:
  ParameterizedPixelResourceTest();
};

}  // namespace cc

#endif  // CC_TEST_LAYER_TREE_PIXEL_RESOURCE_TEST_H_
