// 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 'dart:html';
import 'package:polymer/polymer.dart';
import 'package:unittest/unittest.dart';
import 'package:unittest/html_config.dart';

var _changes = 0;
final _done = new Completer();

checkDone() {
  if (6 == ++_changes) {
    _done.complete();
  }
}

@CustomTag('x-test')
class XTest extends PolymerElement {
  @observable String bar = '';
  @observable String pie;
  @observable Map a;

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

  ready() {
    bar = 'bar';
    pie = 'pie';
    a = {'b': {'c': 'exists'}};
  }

  barChanged() {
    // Dart note: unlike polymer-js we support multiple observers, due to how
    // our @ObserveProperty metadata translated.
    // _done.completeError('barChanged should not be called.');
    expect('bar', 'bar', reason: 'barChanged called');
    checkDone();
  }

  @ObserveProperty('bar pie')
  validate() {
    window.console.log('validate');
    expect('bar', 'bar', reason: 'custom change observer called');
    expect('pie', 'pie', reason: 'custom change observer called');
    checkDone();
  }

  // Dart note: test that we can observe "pie" twice.
  @ObserveProperty('pie')
  validateYummyPie() {
    window.console.log('validateYummyPie');
    expect('pie', 'pie', reason: 'validateYummyPie called');
    checkDone();
  }


  @ObserveProperty('a.b.c')
  validateSubPath(oldValue, newValue) {
    window.console.log('validateSubPath $oldValue $newValue');
    expect(newValue, 'exists', reason: 'subpath change observer called');
    checkDone();
  }
}

@CustomTag('x-test2')
class XTest2 extends XTest {
  @observable String noogle;

  XTest2.created() : super.created();

  @ObserveProperty('noogle')
  validate() => super.validate();

  ready() {
    super.ready();
    noogle = 'noogle';
  }
}

@initMethod
main() {
  useHtmlConfiguration();

  setUp(() => Polymer.onReady);

  test('changes detected', () => _done.future);
}
