// Test widget bool class
casper.notebook_test(function () {
    "use strict";

    // Create a checkbox and togglebutton.
    var bool_index = this.append_cell(
        'from IPython.html import widgets\n' + 
        'from IPython.display import display, clear_output\n' +
        'bool_widgets = [widgets.Checkbox(description="Title", value=True),\n' +
        '    widgets.ToggleButton(description="Title", value=True)]\n' +
        'display(bool_widgets[0])\n' +
        'display(bool_widgets[1])\n' +
        'print("Success")');
    this.execute_cell_then(bool_index, function(index){
        this.test.assertEquals(this.get_output_cell(index).text, 'Success\n', 
            'Create bool widget cell executed with correct output.');
    });

    // Wait for the widgets to actually display.
    var widget_checkbox_selector = '.widget-area .widget-subarea .widget-hbox input';
    var widget_togglebutton_selector = '.widget-area .widget-subarea button';
    this.wait_for_element(bool_index, widget_checkbox_selector);
    this.wait_for_element(bool_index, widget_togglebutton_selector);

    // Continue the tests.
    this.then(function() {
        this.test.assert(this.cell_element_exists(bool_index, 
            '.widget-area .widget-subarea'),
            'Widget subarea exists.');

        this.test.assert(this.cell_element_exists(bool_index, 
            widget_checkbox_selector),
            'Checkbox exists.');

        this.test.assert(this.cell_element_function(bool_index, 
            widget_checkbox_selector, 'prop', ['checked']),
            'Checkbox is checked.');

        this.test.assert(this.cell_element_exists(bool_index, 
            '.widget-area .widget-subarea .widget-hbox .widget-label'),
            'Checkbox label exists.');

        this.test.assert(this.cell_element_function(bool_index, 
            '.widget-area .widget-subarea .widget-hbox .widget-label', 'html')=="Title",
            'Checkbox labeled correctly.');

        this.test.assert(this.cell_element_exists(bool_index, 
            widget_togglebutton_selector),
            'Toggle button exists.');

        this.test.assert(this.cell_element_function(bool_index, 
            widget_togglebutton_selector, 'html')=="Title",
            'Toggle button labeled correctly.');

        this.test.assert(this.cell_element_function(bool_index, 
            widget_togglebutton_selector, 'hasClass', ['active']),
            'Toggle button is toggled.');
    });

    // Try changing the state of the widgets programatically.
    var index = this.append_cell(
        'bool_widgets[0].value = False\n' +
        'bool_widgets[1].value = False\n' +
        'print("Success")');
    this.execute_cell_then(index, function(index){
        this.test.assertEquals(this.get_output_cell(index).text, 'Success\n', 
            'Change bool widget value cell executed with correct output.');

        this.test.assert(! this.cell_element_function(bool_index, 
            widget_checkbox_selector, 'prop', ['checked']),
            'Checkbox is not checked. (1)');

        this.test.assert(! this.cell_element_function(bool_index, 
            widget_togglebutton_selector, 'hasClass', ['active']),
            'Toggle button is not toggled. (1)');
 
        // Try toggling the bool by clicking on the checkbox.
        this.cell_element_function(bool_index, widget_checkbox_selector, 'click');

        this.test.assert(this.cell_element_function(bool_index, 
            widget_checkbox_selector, 'prop', ['checked']),
            'Checkbox is checked. (2)');

        // Try toggling the bool by clicking on the toggle button.
        this.cell_element_function(bool_index, widget_togglebutton_selector, 'click');

        this.test.assert(this.cell_element_function(bool_index, 
            widget_togglebutton_selector, 'hasClass', ['active']),
            'Toggle button is toggled. (3)');

    });
});
