import 'dart:sky' as sky;

export 'dart:sky' show Point;

class TestPointerEvent extends sky.PointerEvent {
  TestPointerEvent({
    this.type,
    this.pointer,
    this.kind,
    this.x,
    this.y,
    this.dx,
    this.dy,
    this.velocityX,
    this.velocityY,
    this.buttons,
    this.down,
    this.primary,
    this.obscured,
    this.pressure,
    this.pressureMin,
    this.pressureMax,
    this.distance,
    this.distanceMin,
    this.distanceMax,
    this.radiusMajor,
    this.radiusMinor,
    this.radiusMin,
    this.radiusMax,
    this.orientation,
    this.tilt
  });

  // These are all of the PointerEvent members, but not all of Event.
  String type;
  int pointer;
  String kind;
  double x;
  double y;
  double dx;
  double dy;
  double velocityX;
  double velocityY;
  int buttons;
  bool down;
  bool primary;
  bool obscured;
  double pressure;
  double pressureMin;
  double pressureMax;
  double distance;
  double distanceMin;
  double distanceMax;
  double radiusMajor;
  double radiusMinor;
  double radiusMin;
  double radiusMax;
  double orientation;
  double tilt;
}

class TestGestureEvent extends sky.GestureEvent {
  TestGestureEvent({
    this.type,
    this.primaryPointer,
    this.x,
    this.y,
    this.dx,
    this.dy,
    this.velocityX,
    this.velocityY
  });

  // These are all of the GestureEvent members, but not all of Event.
  String type;
  int primaryPointer;
  double x;
  double y;
  double dx;
  double dy;
  double velocityX;
  double velocityY;
}

class TestPointer {
  TestPointer([ this.pointer = 1 ]);

  int pointer;
  bool isDown = false;
  sky.Point location;

  sky.PointerEvent down([sky.Point newLocation = sky.Point.origin ]) {
    assert(!isDown);
    isDown = true;
    location = newLocation;
    return new TestPointerEvent(
      type: 'pointerdown',
      pointer: pointer,
      x: location.x,
      y: location.y
    );
  }

  sky.PointerEvent move([sky.Point newLocation = sky.Point.origin ]) {
    assert(isDown);
    sky.Offset delta = newLocation - location;
    location = newLocation;
    return new TestPointerEvent(
      type: 'pointermove',
      pointer: pointer,
      x: newLocation.x,
      y: newLocation.y,
      dx: delta.dx,
      dy: delta.dy
    );
  }

  sky.PointerEvent up() {
    assert(isDown);
    isDown = false;
    return new TestPointerEvent(
      type: 'pointerup',
      pointer: pointer,
      x: location.x,
      y: location.y
    );
  }

  sky.PointerEvent cancel() {
    assert(isDown);
    isDown = false;
    return new TestPointerEvent(
      type: 'pointercancel',
      pointer: pointer,
      x: location.x,
      y: location.y
    );
  }

}
