// Copyright (c) 2013, 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 polymer.test.property_change_test;

import 'dart:async';
import 'package:polymer/polymer.dart';
import 'package:unittest/unittest.dart';
import 'package:unittest/html_config.dart';

// Dart note: this is a tad different from the JS code. We don't support putting
// expandos on Dart objects and then observing them. On the other hand, we want
// to make sure that superclass observers are correctly detected.

final _zonk = new Completer();
final _bar = new Completer();

@reflectable
class XBase extends PolymerElement {
  @observable String zonk = '';

  XBase.created() : super.created();

  zonkChanged() {
    expect(zonk, 'zonk', reason: 'change calls *Changed on superclass');
    _zonk.complete();
  }
}

@CustomTag('x-test')
class XTest extends XBase {
  @observable String bar = '';

  XTest.created() : super.created();

  ready() {
    bar = 'bar';
    new Future(() { zonk = 'zonk'; });
  }

  barChanged() {
    expect(bar, 'bar', reason: 'change in ready calls *Changed');
    _bar.complete();
  }
}

@initMethod
main() {
  useHtmlConfiguration();

  setUp(() => Polymer.onReady);

  test('bar change detected', () => _bar.future);
  test('zonk change detected', () => _zonk.future);
}
