// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library protoc.benchmark.int64_json;

import 'package:fixnum/fixnum.dart' show Int64;

import '../benchmark.dart';
import '../generated/benchmark.pb.dart'
    show BenchmarkID, Request, Params, Sample;
import '../generated/int64grid.pb.dart' as pb;

/// A benchmark that deserializes a grid of int fields.
class Int64Benchmark extends Benchmark {
  final int width;
  final int height;
  String json;
  int lastFieldTag;

  Int64Benchmark(this.width, this.height) : super($id);

  @override
  get summary => "${id.name}($width x $height int64s)";

  @override
  Params makeParams() => new Params()
    ..int64FieldCount = width
    ..messageCount = height;

  @override
  void setup() {
    var grid = _makeGrid(width, height);
    json = grid.writeToJson();
    lastFieldTag = getTagForColumn(new pb.Line10(), width - 1);
  }

  // makes a rectangle of the of the form:
  // 0 1 2 3
  // 1 2 3 4
  // 2 3 4 5
  static pb.Grid10 _makeGrid(int width, int height) {
    if (width > 10) throw new ArgumentError("width out of range: ${width}");
    var grid = new pb.Grid10();

    for (int y = 0; y < height; y++) {
      var line = new pb.Line10();
      for (int x = 0; x < width; x++) {
        int tag = getTagForColumn(line, x);
        line.setField(tag, new Int64(x + y));
      }
      grid.lines.add(line);
    }

    return grid;
  }

  static int getTagForColumn(pb.Line10 line, int x) {
    return line.getTagNumber('cell${x + 1}'); // assume x start from 1
  }

  @override
  void run() {
    pb.Grid10 grid = new pb.Grid10.fromJson(json);
    var actual = grid.lines[height - 1].getField(lastFieldTag);
    if (actual != width + height - 2) throw "failed; got ${actual}";
  }

  @override
  void setCounts(Sample s) {
    s.counts.int64Reads = width * height * s.loopCount;
  }

  @override
  measureSample(Sample s) => int64ReadsPerMillisecond(s);

  @override
  get measureSampleUnits => "int64 reads/ms";

  static const $id = BenchmarkID.READ_INT64_FIELDS_JSON;
  static final $type = new BenchmarkType($id, $create);

  static Int64Benchmark $create(Request r) {
    assert(r.params.hasInt64FieldCount());
    assert(r.params.hasMessageCount());
    return new Int64Benchmark(r.params.int64FieldCount, r.params.messageCount);
  }
}
