// 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_SURFACE_AGGREGATOR_TEST_HELPERS_H_
#define CC_TEST_SURFACE_AGGREGATOR_TEST_HELPERS_H_

#include <vector>

#include "cc/quads/draw_quad.h"
#include "cc/quads/render_pass_id.h"
#include "cc/surfaces/surface_id.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/size.h"

namespace cc {

class RenderPass;
class Surface;
class TestRenderPass;

typedef std::vector<scoped_ptr<RenderPass>> RenderPassList;

namespace test {

struct Quad {
  static Quad SolidColorQuad(SkColor color) {
    Quad quad;
    quad.material = DrawQuad::SOLID_COLOR;
    quad.color = color;
    return quad;
  }

  static Quad SurfaceQuad(SurfaceId surface_id, float opacity) {
    Quad quad;
    quad.material = DrawQuad::SURFACE_CONTENT;
    quad.opacity = opacity;
    quad.surface_id = surface_id;
    return quad;
  }

  static Quad RenderPassQuad(RenderPassId id) {
    Quad quad;
    quad.material = DrawQuad::RENDER_PASS;
    quad.render_pass_id = id;
    return quad;
  }

  DrawQuad::Material material;
  // Set when material==DrawQuad::SURFACE_CONTENT.
  SurfaceId surface_id;
  float opacity;
  // Set when material==DrawQuad::SOLID_COLOR.
  SkColor color;
  // Set when material==DrawQuad::RENDER_PASS.
  RenderPassId render_pass_id;

 private:
  Quad() : material(DrawQuad::INVALID), opacity(1.f), color(SK_ColorWHITE) {}
};

struct Pass {
  Pass(Quad* quads, size_t quad_count, RenderPassId id)
      : quads(quads), quad_count(quad_count), id(id) {}
  Pass(Quad* quads, size_t quad_count)
      : quads(quads), quad_count(quad_count), id(1, 1) {}

  Quad* quads;
  size_t quad_count;
  RenderPassId id;
};

void AddSurfaceQuad(TestRenderPass* pass,
                    const gfx::Size& surface_size,
                    int surface_id);

void AddQuadInPass(TestRenderPass* pass, Quad desc);

void AddPasses(RenderPassList* pass_list,
               const gfx::Rect& output_rect,
               Pass* passes,
               size_t pass_count);

void TestQuadMatchesExpectations(Quad expected_quad, const DrawQuad* quad);

void TestPassMatchesExpectations(Pass expected_pass, const RenderPass* pass);

void TestPassesMatchExpectations(Pass* expected_passes,
                                 size_t expected_pass_count,
                                 const RenderPassList* passes);

}  // namespace test
}  // namespace cc

#endif  // CC_TEST_SURFACE_AGGREGATOR_TEST_HELPERS_H_
