#! /usr/bin/python

# This a simple test, using the dogtail framework:
#
# Click on All, Installed, Updates and check that the button state
# and the main page content update as expected. Type a few characters
# on the overview page, hit Enter, and verify that we end up on the
# search page. Hit Escape and verify that we go back to the overview
# page.

from gi.repository import Gio

settings = Gio.Settings.new("org.gnome.desktop.interface")
settings.set_boolean ("toolkit-accessibility", True)

import os
from dogtail.tree import *
from dogtail.utils import *
from dogtail.procedural import *

try:
    run('gnome-software')

    app_name = 'gnome-software'
    app = root.application(app_name)

    all_button = app.child('All')
    installed_button = app.child('Installed')
    updates_button = app.child('Updates')
    back_button = app.child('Go back')

    overview_page = app.child('Overview page')
    installed_page = app.child('Installed page')
    updates_page = app.child('Updates page')
    search_page = app.child('Search page')
    details_page = app.child('Details page')
    install_button = details_page.child('Install')
    uninstall_button = details_page.child('Uninstall')

    search_page_listbox = search_page.child(roleName='list box')

    try:
        shopping_button = app.child(name=u'Browse Software', retry=False)
        shopping_button.click()
    except tree.SearchError:
        print "not first-run, moving on"

    all_button.click()
    assert (all_button.checked)
    assert (not installed_button.checked)
    assert (not updates_button.checked)
    assert (overview_page.showing)
    assert (not installed_page.showing)
    assert (not updates_page.showing)
    assert (not search_page.showing)

    installed_button.click()
    assert (not all_button.checked)
    assert (installed_button.checked)
    assert (not updates_button.checked)
    assert (not overview_page.showing)
    assert (installed_page.showing)
    assert (not updates_page.showing)
    assert (not search_page.showing)

    updates_button.click()
    assert (not all_button.checked)
    assert (not installed_button.checked)
    assert (updates_button.checked)
    assert (not overview_page.showing)
    assert (not installed_page.showing)
    assert (updates_page.showing)
    assert (not search_page.showing)

    installed_button.click()
    assert (not all_button.checked)
    assert (installed_button.checked)
    assert (not updates_button.checked)
    assert (not overview_page.showing)
    assert (installed_page.showing)
    assert (not updates_page.showing)
    assert (not search_page.showing)

    all_button.click()
    assert (all_button.checked)
    assert (not installed_button.checked)
    assert (not updates_button.checked)
    assert (overview_page.showing)
    assert (not installed_page.showing)
    assert (not updates_page.showing)
    assert (not search_page.showing)

    type("archive\n")
    doDelay(2)
    assert (not all_button.checked)
    assert (not installed_button.checked)
    assert (not updates_button.checked)
    assert (not overview_page.showing)
    assert (not installed_page.showing)
    assert (not updates_page.showing)
    assert (search_page.showing)

    """Details page test section"""
    search_page_listbox.child(roleName='label', name='Archive Manager').click()
    doDelay(4)
    assert (not overview_page.showing)
    assert (not installed_page.showing)
    assert (not updates_page.showing)
    assert (not search_page.showing)
    assert (details_page.showing)
    assert (install_button.showing or uninstall_button.showing)
    assert (back_button.showing)
    assert (root.application(app_name).child('Details page')
            .child(roleName='push button', name='History')
            .states.contains(pyatspi.STATE_VISIBLE))
    assert (root.application(app_name).child('Details page')
            .child(roleName='push button', name='Website')
            .states.contains(pyatspi.STATE_VISIBLE))

    if install_button.showing:
        assert (not root.application(app_name).child('Details page')
                    .child(roleName='push button', name='Launch')
                    .states.contains(pyatspi.STATE_VISIBLE))
    else:
        assert (root.application(app_name).child('Details page')
                .child(roleName='push button', name='Launch')
                .states.contains(pyatspi.STATE_VISIBLE))

    back_button.click()
    assert (not all_button.checked)
    assert (not installed_button.checked)
    assert (not updates_button.checked)
    assert (not overview_page.showing)
    assert (not installed_page.showing)
    assert (not updates_page.showing)
    assert (search_page.showing)
    assert (not install_button.showing)
    assert (not uninstall_button.showing)
    assert (not back_button.showing)

    keyCombo("Escape")
    assert (all_button.checked)
    assert (not installed_button.checked)
    assert (not updates_button.checked)
    assert (overview_page.showing)
    assert (not installed_page.showing)
    assert (not updates_page.showing)
    assert (not search_page.showing)

    super_menu = root.application('gnome-shell').child(roleName='menu', name='Software')
    super_menu.click()
    root.application('gnome-shell').child(roleName='label', name='Software Sources').click()
    assert (len(app.children) == 2)
    sources_dialog = app.children[-1]
    assert (sources_dialog.child(roleName='label', name='Software Sources'))
finally:
    os.system("killall gnome-software")
