// 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.

import 'dart:html';
import 'package:unittest/unittest.dart';
import 'package:unittest/html_config.dart';
import 'package:polymer/platform.dart' as Platform;
import 'package:polymer/polymer.dart';

class XFoo extends PolymerElement {
  XFoo.created() : super.created();

  @observable var foo = '';
  @observable String baz = '';
}

class XBar extends XFoo {
  XBar.created() : super.created();

  @observable int zot = 3;
  @observable bool zim = false;
  @observable String str = 'str';
  @observable Object obj;
}

class XCompose extends PolymerElement {
  XCompose.created() : super.created();

  @observable bool zim = false;
}

@initMethod _main() {
  useHtmlConfiguration();

  // Most tests use @CustomTag, here we test out the impertive register:
  Polymer.register('x-foo', XFoo);
  Polymer.register('x-bar', XBar);
  Polymer.register('x-compose', XCompose);

  test('property attribute reflection', () {
    var xcompose = query('x-compose').xtag;
    var xfoo = query('x-foo').xtag;
    xfoo.foo = 5;
    Platform.flush();
    Platform.endOfMicrotask(expectAsync0(() {
      expect(xcompose.$['bar'].attributes.containsKey('zim'), false,
          reason: 'attribute bound to property updates when binding is made');

      expect('${xfoo.foo}', xfoo.attributes['foo'],
          reason: 'attribute reflects property as string');
      xfoo.attributes['foo'] = '27';
      // TODO(jmesserly): why is JS leaving this as a String? From the code it
      // looks like it should use the type of 5 and parse it as a number.
      expect('${xfoo.foo}', xfoo.attributes['foo'],
          reason: 'property reflects attribute');
      //
      xfoo.baz = 'Hello';
      Platform.flush();
      Platform.endOfMicrotask(expectAsync0(() {
        expect(xfoo.baz, xfoo.attributes['baz'],
            reason: 'attribute reflects property');
        //
        var xbar = query('x-bar').xtag;
        //
        xbar.foo = 'foo!';
        xbar.zot = 27;
        xbar.zim = true;
        xbar.str = 'str!';
        xbar.obj = {'hello': 'world'};
        Platform.flush();
        Platform.endOfMicrotask(expectAsync0(() {
          expect(xbar.foo, xbar.attributes['foo'],
              reason: 'inherited published property is reflected');
          expect('${xbar.zot}', xbar.attributes['zot'],
              reason: 'attribute reflects property as number');
          expect(xbar.attributes['zim'], '', reason:
              'attribute reflects true valued boolean property as '
              'having attribute');
          expect(xbar.str, xbar.attributes['str'],
              reason: 'attribute reflects property as published string');
          expect(xbar.attributes.containsKey('obj'), false,
              reason: 'attribute does not reflect object property');
          xbar.attributes['zim'] = 'false';
          xbar.attributes['foo'] = 'foo!!';
          xbar.attributes['zot'] = '54';
          xbar.attributes['str'] = 'str!!';
          xbar.attributes['obj'] = "{'hello': 'world'}";
          expect(xbar.foo, xbar.attributes['foo'],
              reason: 'property reflects attribute as string');
          expect(xbar.zot, 54,
              reason: 'property reflects attribute as number');
          expect(xbar.zim, false,
              reason: 'property reflects attribute as boolean');
          expect(xbar.str, 'str!!',
              reason: 'property reflects attribute as published string');
          expect(xbar.obj, {'hello': 'world'},
              reason: 'property reflects attribute as object');
          xbar.zim = false;
          Platform.flush();
          Platform.endOfMicrotask(expectAsync0(() {
            expect(xbar.attributes.containsKey('zim'), false, reason:
                'attribute reflects false valued boolean property as NOT '
                'having attribute');
            var objAttr = xbar.attributes['obj'];
            xbar.obj = 'hi';
            Platform.endOfMicrotask(expectAsync0(() {
              expect(xbar.attributes['obj'], objAttr, reason:
                  'do not reflect property with default type of object');
            }));
          }));
        }));
      }));
    }));
  });
}
