[orca] Begin migration to generators for creating flat review zones



commit c0bf4bec8469739b94a268f5af8ff13ad335b124
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Wed Aug 24 02:52:17 2016 -0400

    Begin migration to generators for creating flat review zones
    
    * Eliminates duplicated (and sometimes incorrect) code
    * Fixes reviewability of Gtk+ icon panels and Gtk+ spin button values

 src/orca/braille_generator.py                      |    3 +
 src/orca/flat_review.py                            |  373 ++++++--------------
 src/orca/generator.py                              |   31 ++
 src/orca/script_utilities.py                       |    8 +-
 src/orca/scripts/web/script_utilities.py           |    7 +-
 src/orca/speech_generator.py                       |    2 +-
 test/keystrokes/gnome-clocks/timer_flat_review.py  |   44 ++--
 .../gnome-terminal/man_page_flat_review.py         |   18 +-
 test/keystrokes/gtk-demo/role_icon_flat_review.py  |   73 ++--
 .../gtk3-demo/role_dialog_flat_review.py           |   33 +-
 test/keystrokes/gtk3-demo/role_icon_flat_review.py |   73 ++--
 11 files changed, 261 insertions(+), 404 deletions(-)
---
diff --git a/src/orca/braille_generator.py b/src/orca/braille_generator.py
index f01f499..264bd1a 100644
--- a/src/orca/braille_generator.py
+++ b/src/orca/braille_generator.py
@@ -356,6 +356,9 @@ class BrailleGenerator(generator.Generator):
            and not self._shouldPresentProgressBarUpdate(obj, **args):
             return []
 
+        return self._generatePercentage(obj, **args)
+
+    def _generatePercentage(self, obj, **args):
         percent = self._script.utilities.getValueAsPercent(obj)
         if percent is not None:
             return ['%s%%' % percent]
diff --git a/src/orca/flat_review.py b/src/orca/flat_review.py
index 5c782f3..04558c7 100644
--- a/src/orca/flat_review.py
+++ b/src/orca/flat_review.py
@@ -1,6 +1,7 @@
 # Orca
 #
 # Copyright 2005-2008 Sun Microsystems Inc.
+# Copyright 2016 Igalia, S.L.
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -22,7 +23,8 @@
 __id__        = "$Id$"
 __version__   = "$Revision$"
 __date__      = "$Date$"
-__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc." \
+                "Copyright (c) 2016 Igalia, S.L."
 __license__   = "LGPL"
 
 import pyatspi
@@ -32,7 +34,6 @@ from . import braille
 from . import debug
 from . import eventsynthesizer
 from . import messages
-from . import object_properties
 from . import orca_state
 from . import settings
 
@@ -334,113 +335,56 @@ class TextZone(Zone):
 
 
 class StateZone(Zone):
-    """Represents a Zone for an accessible that shows a state using
-    a graphical indicator, such as a checkbox or radio button."""
+    """A Zone whose purpose is to display the state of an object."""
 
-    def __init__(self,
-                 accessible,
-                 x, y,
-                 width, height,
-                 role=None):
-        Zone.__init__(self, accessible, "", x, y, width, height, role)
+    def __init__(self, accessible, x, y, width, height, role=None):
+        super().__init__(accessible, "", x, y, width, height, role)
 
-        # Force the use of __getattr__ so we get the actual state
-        # of the accessible each time we look at the 'string' field.
-        #
-        del self.string
+    def __getattribute__(self, attr):
+        """To ensure we update the state."""
 
-    def __getattr__(self, attr):
-        if attr in ["string", "length", "brailleString"]:
-            # stateCount is used as a boolean and as an index
-            stateset = self.accessible.getState()
-            if stateset.contains(pyatspi.STATE_INDETERMINATE):
-                stateCount = 2
-            elif stateset.contains(pyatspi.STATE_CHECKED):
-                stateCount = 1
-            else:
-                stateCount = 0
-            if self.role in [pyatspi.ROLE_CHECK_BOX,
-                             pyatspi.ROLE_CHECK_MENU_ITEM,
-                             pyatspi.ROLE_TABLE_CELL]:
-                if stateCount == 2:
-                    speechState = object_properties.STATE_PARTIALLY_CHECKED
-                elif stateCount == 1:
-                    speechState = object_properties.STATE_CHECKED
-                else:
-                    speechState = object_properties.STATE_NOT_CHECKED
-                brailleState = \
-                    object_properties.CHECK_BOX_INDICATORS_BRAILLE[stateCount]
-            elif self.role == pyatspi.ROLE_TOGGLE_BUTTON:
-                if stateCount:
-                    speechState = object_properties.STATE_PRESSED
-                else:
-                    speechState = object_properties.STATE_NOT_PRESSED
-                brailleState = \
-                    object_properties.RADIO_BUTTON_INDICATORS_BRAILLE[stateCount]
-            else:
-                if stateCount:
-                    speechState = object_properties.STATE_SELECTED_RADIO_BUTTON
-                else:
-                    speechState = object_properties.STATE_UNSELECTED_RADIO_BUTTON
-                brailleState = \
-                    object_properties.RADIO_BUTTON_INDICATORS_BRAILLE[stateCount]
+        if attr not in ["string", "brailleString"]:
+            return super().__getattribute__(attr)
 
-            if attr == "string":
-                return speechState
-            elif attr == "length":
-                return len(speechState)
-            elif attr == "brailleString":
-                return brailleState
+        if attr == "string":
+            generator = orca_state.activeScript.speechGenerator
         else:
-            return Zone.__getattr__(self, attr)
+            generator = orca_state.activeScript.brailleGenerator
 
-class ValueZone(Zone):
-    """Represents a Zone for an accessible that shows a value using
-    a graphical indicator, such as a progress bar or slider."""
+        result = generator.getStateIndicator(self.accessible, role=self.role)
+        if result:
+            return result[0]
 
-    def __init__(self,
-                 accessible,
-                 x, y,
-                 width, height,
-                 role=None):
-        Zone.__init__(self, accessible, "", x, y, width, height, role)
+        return ""
 
-        # Force the use of __getattr__ so we get the actual state
-        # of the accessible each time we look at the 'string' field.
-        #
-        del self.string
 
-    def __getattr__(self, attr):
-        if attr in ["string", "length", "brailleString"]:
-            try:
-                value = self.accessible.queryValue()
-            except NotImplementedError:
-                debug.println(debug.LEVEL_FINE,
-                              'ValueZone does not implement Value interface')
-            try:
-                percentValue = int((value.currentValue /
-                                    (value.maximumValue - value.minimumValue))
-                                   * 100.0)
-            except:
-                percentValue = 0
+class ValueZone(Zone):
+    """A Zone whose purpose is to display the value of an object."""
 
-            script = orca_state.activeScript
-            speechValue = script.speechGenerator.getLocalizedRoleName(
-                self.accessible, alreadyFocused=True)
-            speechValue = speechValue + " " + messages.percentage(percentValue)
+    def __init__(self, accessible, x, y, width, height, role=None):
+        super().__init__(accessible, "", x, y, width, height, role)
 
-            brailleValue = script.brailleGenerator.getLocalizedRoleName(
-                self.accessible, alreadyFocused=True)
-            brailleValue = "%s %d%%" % (brailleValue, percentValue)
+    def __getattribute__(self, attr):
+        """To ensure we update the value."""
 
-            if attr == "string":
-                return speechValue
-            elif attr == "length":
-                return len(speechValue)
-            elif attr == "brailleString":
-                return brailleValue
+        if attr not in ["string", "brailleString"]:
+            return super().__getattribute__(attr)
+
+        if attr == "string":
+            generator = orca_state.activeScript.speechGenerator
         else:
-            return Zone.__getattr__(self, attr)
+            generator = orca_state.activeScript.brailleGenerator
+
+        result = ""
+
+        # TODO - JD: This cobbling together beats what we had, but the
+        # generators should also be doing the assembly.
+        rolename = generator.getLocalizedRoleName(self.accessible)
+        value = generator.getValue(self.accessible)
+        if rolename and value:
+            result = "%s %s" % (rolename, value[0])
+
+        return result
 
 
 class Line:
@@ -967,63 +911,47 @@ class Context:
 
         return zones
 
-    def _insertStateZone(self, zones, accessible, role=None):
+    def _insertStateZone(self, zones, accessible, extents):
         """If the accessible presents non-textual state, such as a
         checkbox or radio button, insert a StateZone representing
         that state."""
 
-        zone = None
-        stateOnLeft = True
-
-        role = role or accessible.getRole()
-        if role in [pyatspi.ROLE_CHECK_BOX,
-                    pyatspi.ROLE_CHECK_MENU_ITEM,
-                    pyatspi.ROLE_RADIO_BUTTON,
-                    pyatspi.ROLE_RADIO_MENU_ITEM]:
+        # TODO - JD: This whole thing is pretty hacky. Either do it
+        # right or nuke it.
 
-            # Attempt to infer if the indicator is to the left or
-            # right of the text.
-            #
-            extents = accessible.queryComponent().getExtents(0)
-            stateX = extents.x
-            stateY = extents.y
-            stateWidth = 1
-            stateHeight = extents.height
+        indicatorExtents = extents.x, extents.y, 1, extents.height
+        role = accessible.getRole()
+        if role == pyatspi.ROLE_TOGGLE_BUTTON:
+            zone = StateZone(accessible, *indicatorExtents, role=role)
+            if zone:
+                zones.insert(0, zone)
+            return
 
-            try:
-                text = accessible.queryText()
-            except NotImplementedError:
-                pass
-            else:
-                [x, y, width, height] = \
-                    text.getRangeExtents( \
-                        0, text.characterCount, 0)
-                textToLeftEdge = x - extents.x
-                textToRightEdge = (extents.x + extents.width) - (x + width)
-                stateOnLeft = textToLeftEdge > 20
-                if stateOnLeft:
-                    stateWidth = textToLeftEdge
-                else:
-                    stateX = x + width
-                    stateWidth = textToRightEdge
+        if role == pyatspi.ROLE_TABLE_CELL \
+           and self.script.utilities.hasMeaningfulToggleAction(accessible):
+            role = pyatspi.ROLE_CHECK_BOX
 
-            zone = StateZone(accessible,
-                             stateX, stateY, stateWidth, stateHeight)
+        if role not in [pyatspi.ROLE_CHECK_BOX,
+                        pyatspi.ROLE_CHECK_MENU_ITEM,
+                        pyatspi.ROLE_RADIO_BUTTON,
+                        pyatspi.ROLE_RADIO_MENU_ITEM]:
+            return
 
-        elif role ==  pyatspi.ROLE_TOGGLE_BUTTON:
-            # [[[TODO: WDW - This is a major hack.  We make up an
-            # indicator for a toggle button to let the user know
-            # whether a toggle button is pressed or not.]]]
-            #
-            extents = accessible.queryComponent().getExtents(0)
-            zone = StateZone(accessible,
-                             extents.x, extents.y, 1, extents.height)
+        zone = None
+        stateOnLeft = True
 
-        elif role == pyatspi.ROLE_TABLE_CELL:
-            # Handle table cells that act like check boxes.
-            if self.script.utilities.hasMeaningfulToggleAction(accessible):
-                self._insertStateZone(zones, accessible, pyatspi.ROLE_CHECK_BOX)
+        if len(zones) == 1 and isinstance(zones[0], TextZone):
+            textZone = zones[0]
+            textToLeftEdge = textZone.x - extents.x
+            textToRightEdge = (extents.x + extents.width) - (textZone.x + width)
+            stateOnLeft = textToLeftEdge > 20
+            if stateOnLeft:
+                indicatorExtents[2] = textToLeftEdge
+            else:
+                indicatorExtents[0] = textZone.x + width
+                indicatorExtents[2] = textToRightEdge
 
+        zone = StateZone(accessible, *indicatorExtents, role=role)
         if zone:
             if stateOnLeft:
                 zones.insert(0, zone)
@@ -1037,31 +965,21 @@ class Context:
         - accessible: the accessible
         - cliprect: the extents that the Zones must fit inside.
         """
-        icomponent = accessible.queryComponent()
-        if not icomponent:
-            return []
-
-        # Get the component extents in screen coordinates.
-        #
-        extents = icomponent.getExtents(0)
 
-        if not self.script.utilities.containsRegion(
-                extents.x, extents.y,
-                extents.width, extents.height,
-                cliprect.x, cliprect.y,
-                cliprect.width, cliprect.height):
+        try:
+            component = accessible.queryComponent()
+            extents = component.getExtents(pyatspi.DESKTOP_COORDS)
+        except:
             return []
 
-        debug.println(
-            debug.LEVEL_FINEST,
-            "flat_review.getZonesFromAccessible (name=%s role=%s)" \
-            % (accessible.name, accessible.getRoleName()))
+        if not self.script.utilities.containsRegion(*extents, *cliprect):
+            return []
 
-        # Now see if there is any accessible text.  If so, find new zones,
-        # where each zone represents a line of this text object.  When
-        # creating the zone, only keep track of the text that is actually
-        # showing on the screen.
-        #
+        try:
+            role = accessible.getRole()
+            childCount = accessible.childCount
+        except:
+            return []
 
         try:
             accessible.queryText()
@@ -1070,114 +988,27 @@ class Context:
         else:
             zones = self.getZonesFromText(accessible, cliprect)
 
-        # We really want the accessible text information.  But, if we have
-        # an image, and it has a description, we can fall back on it.
-        # First, try to get the image interface.
-        try:
-            iimage = accessible.queryImage()
-        except NotImplementedError:
-            iimage = None
-        
-        if (len(zones) == 0) and iimage:
-            # Check for accessible.name, if it exists and has len > 0, use it
-            # Otherwise, do the same for accessible.description
-            # Otherwise, do the same for accessible.image.description
-            imageName = ""
-            if accessible.name and len(accessible.name):
-                imageName = accessible.name
-            elif accessible.description and len(accessible.description):
-                imageName = accessible.description
-            elif iimage.imageDescription and \
-                     len(iimage.imageDescription):
-                imageName = iimage.imageDescription
-
-            [x, y] = iimage.getImagePosition(0)
-            [width, height] = iimage.getImageSize()
-
-            if width != 0 and height != 0 \
-               and self.script.utilities.containsRegion(
-                    x, y, width, height,
-                    cliprect.x, cliprect.y,
-                    cliprect.width, cliprect.height):
-
-                clipping = self.clip(x, y, width, height,
-                                     cliprect.x, cliprect.y,
-                                     cliprect.width, cliprect.height)
-
-                if (clipping[2] != 0) or (clipping[3] != 0):
-                    zones.append(Zone(accessible,
-                                      imageName,
-                                      clipping[0],
-                                      clipping[1],
-                                      clipping[2],
-                                      clipping[3]))
-
-        # If the accessible is a parent, we really only looked at it for
-        # its accessible text.  So...we'll skip the hacking here if that's
-        # the case.  [[[TODO: WDW - HACK That is, except in the case of
-        # combo boxes, which don't implement the accesible text
-        # interface.  We also hack with MENU items for similar reasons.]]]
-        #
-        # Otherwise, even if we didn't get anything of use, we certainly
-        # know there's something there.  If that's the case, we'll just
-        # use the component extents and the name or description of the
-        # accessible.
-        #
-        clipping = self.clip(extents.x, extents.y,
-                             extents.width, extents.height,
-                             cliprect.x, cliprect.y,
-                             cliprect.width, cliprect.height)
-        role = accessible.getRole()
-
-        if (len(zones) == 0) \
-            and role in [pyatspi.ROLE_SCROLL_BAR,
-                         pyatspi.ROLE_SLIDER,
-                         pyatspi.ROLE_PROGRESS_BAR]:
-            zones.append(ValueZone(accessible,
-                                   clipping[0],
-                                   clipping[1],
-                                   clipping[2],
-                                   clipping[3]))
-        elif (role != pyatspi.ROLE_COMBO_BOX) \
-            and (role != pyatspi.ROLE_EMBEDDED) \
-            and (role != pyatspi.ROLE_LABEL) \
-            and (role != pyatspi.ROLE_MENU) \
-            and (role != pyatspi.ROLE_PAGE_TAB) \
-            and accessible.childCount > 0:
+        clipping = self.clip(*extents, *cliprect)
+        if not zones and role in [pyatspi.ROLE_SCROLL_BAR,
+                                  pyatspi.ROLE_SLIDER,
+                                  pyatspi.ROLE_PROGRESS_BAR]:
+            zones.append(ValueZone(accessible, *clipping))
+        elif childCount and role not in [pyatspi.ROLE_COMBO_BOX,
+                                         pyatspi.ROLE_EMBEDDED,
+                                         pyatspi.ROLE_LABEL,
+                                         pyatspi.ROLE_MENU,
+                                         pyatspi.ROLE_PAGE_TAB]:
             pass
-        elif len(zones) == 0:
-            string = ""
-            if role == pyatspi.ROLE_COMBO_BOX:
-                try:
-                    selection = accessible[0].querySelection()
-                except:
-                    string = self.script.utilities.displayedText(accessible[0])
-                else:
-                    item = selection.getSelectedChild(0)
-                    if item:
-                        string = item.name
-
-            if not string and accessible.name and len(accessible.name):
-                string = accessible.name
-            elif accessible.description and len(accessible.description):
-                string = accessible.description
-
-            if not string and role == pyatspi.ROLE_ICON:
-                string = self.script.utilities.displayedText(accessible)
-
-            if (string == "") \
-                and (role != pyatspi.ROLE_TABLE_CELL):
-                string = accessible.getLocalizedRoleName()
-
-            if len(string) and ((clipping[2] != 0) or (clipping[3] != 0)):
-                zones.append(Zone(accessible,
-                                  string,
-                                  clipping[0],
-                                  clipping[1],
-                                  clipping[2],
-                                  clipping[3]))
-
-        self._insertStateZone(zones, accessible)
+        elif not zones:
+            string = self.script.speechGenerator.getName(accessible)
+            if not string and role != pyatspi.ROLE_TABLE_CELL:
+                string = self.script.speechGenerator.getLocalizedRoleName(accessible)
+
+            # TODO - JD: This check will become obsolete soon.
+            if string and (clipping[2] or clipping[3] != 0):
+                zones.append(Zone(accessible, string, *clipping))
+
+        self._insertStateZone(zones, accessible, extents)
 
         return zones
 
diff --git a/src/orca/generator.py b/src/orca/generator.py
index cf193ad..66fc3d5 100644
--- a/src/orca/generator.py
+++ b/src/orca/generator.py
@@ -1211,3 +1211,34 @@ class Generator:
             atkRole = Atk.role_for_name("statusbar")
 
         return Atk.role_get_localized_name(atkRole)
+
+    def getStateIndicator(self, obj, **args):
+        role = args.get('role', obj.getRole())
+
+        if role == pyatspi.ROLE_MENU_ITEM:
+            return self._generateMenuItemCheckedState(obj, **args)
+
+        if role in [pyatspi.ROLE_RADIO_BUTTON, pyatspi.ROLE_RADIO_MENU_ITEM]:
+            return self._generateRadioState(obj, **args)
+
+        if role in [pyatspi.ROLE_CHECK_BOX, pyatspi.ROLE_CHECK_MENU_ITEM]:
+            return self._generateCheckedState(obj, **args)
+
+        if role == pyatspi.ROLE_TOGGLE_BUTTON:
+            return self._generateToggleState(obj, **args)
+
+        if role == pyatspi.ROLE_TABLE_CELL:
+            return self._generateCellCheckedState(obj, **args)
+
+        return []
+
+    def getValue(self, obj, **args):
+        role = args.get('role', obj.getRole())
+
+        if role == pyatspi.ROLE_PROGRESS_BAR:
+            return self._generateProgressBarValue(obj, **args)
+
+        if role in [pyatspi.ROLE_SCROLL_BAR, pyatspi.ROLE_SLIDER]:
+            return self._generatePercentage(obj, **args)
+
+        return []
diff --git a/src/orca/script_utilities.py b/src/orca/script_utilities.py
index fe4086c..b269ec0 100644
--- a/src/orca/script_utilities.py
+++ b/src/orca/script_utilities.py
@@ -907,6 +907,11 @@ class Utilities:
             debug.println(debug.LEVEL_INFO, msg, True)
             return None
 
+        if maxval == minval == val:
+            if 1 <= val <= 100:
+                return int(val)
+            return None
+
         return int((val / (maxval - minval)) * 100)
 
     def isDocument(self, obj):
@@ -3526,9 +3531,6 @@ class Utilities:
         return table.getRowExtentAt(row, col), table.getColumnExtentAt(row, col)
 
     def rowAndColumnCount(self, obj):
-        if not (obj and obj.getRole() == pyatspi.ROLE_TABLE):
-            return -1, -1
-
         try:
             table = obj.queryTable()
         except:
diff --git a/src/orca/scripts/web/script_utilities.py b/src/orca/scripts/web/script_utilities.py
index d7615ea..3bb1c38 100644
--- a/src/orca/scripts/web/script_utilities.py
+++ b/src/orca/scripts/web/script_utilities.py
@@ -192,12 +192,7 @@ class Utilities(script_utilities.Utilities):
         if self.isDocument(obj):
             return obj
 
-        document = pyatspi.findAncestor(obj, self.isDocument)
-        if not document:
-            msg = "WEB: Could not find document for %s" % obj
-            debug.println(debug.LEVEL_INFO, msg, True)
-
-        return document
+        return pyatspi.findAncestor(obj, self.isDocument)
 
     def _getDocumentsEmbeddedBy(self, frame):
         isEmbeds = lambda r: r.getRelationType() == pyatspi.RELATION_EMBEDS
diff --git a/src/orca/speech_generator.py b/src/orca/speech_generator.py
index 6d0cc99..3f01895 100644
--- a/src/orca/speech_generator.py
+++ b/src/orca/speech_generator.py
@@ -1280,7 +1280,7 @@ class SpeechGenerator(generator.Generator):
 
         percentValue = self._script.utilities.getValueAsPercent(obj)
         if percentValue is not None:
-            result = [percentValue]
+            result = [messages.percentage(percentValue)]
             result.extend(self.voice(SYSTEM))
             return result
 
diff --git a/test/keystrokes/gnome-clocks/timer_flat_review.py 
b/test/keystrokes/gnome-clocks/timer_flat_review.py
index f88e107..3a27bcc 100644
--- a/test/keystrokes/gnome-clocks/timer_flat_review.py
+++ b/test/keystrokes/gnome-clocks/timer_flat_review.py
@@ -48,10 +48,9 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_7"))
 sequence.append(utils.AssertPresentationAction(
     "4. Review previous line",
-    ["KNOWN ISSUE: We're not presenting the displayed values",
-     "BRAILLE LINE:  'label spin button ∶ spin button ∶ spin button label $l'",
-     "     VISIBLE:  'label spin button ∶ spin button ', cursor=1",
-     "SPEECH OUTPUT: 'label spin button ∶ spin button ∶ spin button label'"]))
+    ["BRAILLE LINE:  'label 00 ∶ 04 ∶ 58 label $l'",
+     "     VISIBLE:  'label 00 ∶ 04 ∶ 58 label $l', cursor=1",
+     "SPEECH OUTPUT: 'label 00 ∶ 04 ∶ 58 label'"])) 
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_7"))
@@ -64,17 +63,16 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Review next line",
-    ["KNOWN ISSUE: The spin buttons are no longer showing",
-     "BRAILLE LINE:  'label spin button ∶ spin button ∶ spin button label $l'",
-     "     VISIBLE:  'label spin button ∶ spin button ', cursor=1",
-     "SPEECH OUTPUT: 'label spin button ∶ spin button ∶ spin button label'"]))
+    "6. Review next line",
+    ["BRAILLE LINE:  'label 00 ∶ 04 ∶ 58 label $l'",
+     "     VISIBLE:  'label 00 ∶ 04 ∶ 58 label $l', cursor=1",
+     "SPEECH OUTPUT: 'label 00 ∶ 04 ∶ 58 label'"])) 
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Subtract"))
 sequence.append(KeyComboAction("KP_Subtract"))
 sequence.append(utils.AssertPresentationAction(
-    "6. Toggle flat review",
+    "7. Toggle flat review",
     ["BRAILLE LINE:  'Leaving flat review.'",
      "     VISIBLE:  'Leaving flat review.', cursor=0",
      "BRAILLE LINE:  'gnome-clocks application frame Pause push button'",
@@ -90,29 +88,29 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_7"))
 sequence.append(utils.AssertPresentationAction(
-    "7. Review previous line",
-    ["KNOWN ISSUE: The spin buttons are no longer showing",
-     "BRAILLE LINE:  'label spin button ∶ spin button ∶ spin button label $l'",
-     "     VISIBLE:  'label spin button ∶ spin button ', cursor=1",
-     "SPEECH OUTPUT: 'label spin button ∶ spin button ∶ spin button label'"]))
+    "8. Review previous line",
+    ["BRAILLE LINE:  'label 00 ∶ 04 ∶ 49 label $l'",
+     "     VISIBLE:  'label 00 ∶ 04 ∶ 49 label $l', cursor=1",
+     "SPEECH OUTPUT: 'label 00 ∶ 04 ∶ 49 label'"])) 
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_8"))
 sequence.append(utils.AssertPresentationAction(
-    "8. Review current line",
-    ["BRAILLE LINE:  'label spin button ∶ spin button ∶ spin button label $l'",
-     "     VISIBLE:  'label spin button ∶ spin button ', cursor=1",
-     "SPEECH OUTPUT: 'label spin button ∶ spin button ∶ spin button label'"]))
+    "9. Review current line",
+    ["BRAILLE LINE:  'label 00 ∶ 04 ∶ 49 label $l'",
+     "     VISIBLE:  'label 00 ∶ 04 ∶ 49 label $l', cursor=1",
+     "SPEECH OUTPUT: 'label 00 ∶ 04 ∶ 49 label'"]))
 
 sequence.append(PauseAction(3000))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_8"))
 sequence.append(utils.AssertPresentationAction(
-    "9. Review current line",
-    ["BRAILLE LINE:  'label spin button ∶ spin button ∶ spin button label $l'",
-     "     VISIBLE:  'label spin button ∶ spin button ', cursor=1",
-     "SPEECH OUTPUT: 'label spin button ∶ spin button ∶ spin button label'"]))
+    "10. Review current line",
+    ["KNOWN ISSUE: The values are now being displayed, but are not yet being updated. Also the labels are 
useless.",
+     "BRAILLE LINE:  'label 00 ∶ 04 ∶ 49 label $l'",
+     "     VISIBLE:  'label 00 ∶ 04 ∶ 49 label $l', cursor=1",
+     "SPEECH OUTPUT: 'label 00 ∶ 04 ∶ 49 label'"]))
 
 sequence.append(utils.AssertionSummaryAction())
 sequence.start()
diff --git a/test/keystrokes/gnome-terminal/man_page_flat_review.py 
b/test/keystrokes/gnome-terminal/man_page_flat_review.py
index 5da5583..c211646 100644
--- a/test/keystrokes/gnome-terminal/man_page_flat_review.py
+++ b/test/keystrokes/gnome-terminal/man_page_flat_review.py
@@ -69,9 +69,9 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
     "7. Review next line",
-    ["BRAILLE LINE:  'vertical scroll bar 0% $l'",
-     "     VISIBLE:  'vertical scroll bar 0% $l', cursor=1",
-     "SPEECH OUTPUT: 'vertical scroll bar 0 percent.'"]))
+    ["BRAILLE LINE:  'vertical scroll bar 3% $l'",
+     "     VISIBLE:  'vertical scroll bar 3% $l', cursor=1",
+     "SPEECH OUTPUT: 'vertical scroll bar 3 percent.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
@@ -182,9 +182,9 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
     "17. Review next line",
-    ["BRAILLE LINE:  'vertical scroll bar 0% $l'",
-     "     VISIBLE:  'vertical scroll bar 0% $l', cursor=1",
-     "SPEECH OUTPUT: 'vertical scroll bar 0 percent.'"]))
+    ["BRAILLE LINE:  'vertical scroll bar 26% $l'",
+     "     VISIBLE:  'vertical scroll bar 26% $l', cursor=1",
+     "SPEECH OUTPUT: 'vertical scroll bar 26 percent.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
@@ -280,9 +280,9 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
     "25. Review next line",
-    ["BRAILLE LINE:  'vertical scroll bar 0% $l'",
-     "     VISIBLE:  'vertical scroll bar 0% $l', cursor=1",
-     "SPEECH OUTPUT: 'vertical scroll bar 0 percent.'"]))
+    ["BRAILLE LINE:  'vertical scroll bar 26% $l'",
+     "     VISIBLE:  'vertical scroll bar 26% $l', cursor=1",
+     "SPEECH OUTPUT: 'vertical scroll bar 26 percent.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
diff --git a/test/keystrokes/gtk-demo/role_icon_flat_review.py 
b/test/keystrokes/gtk-demo/role_icon_flat_review.py
index 92c4c37..e95acdd 100644
--- a/test/keystrokes/gtk-demo/role_icon_flat_review.py
+++ b/test/keystrokes/gtk-demo/role_icon_flat_review.py
@@ -28,34 +28,33 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_8"))
 sequence.append(utils.AssertPresentationAction(
     "2. Review current line",
-    ["KNOWN ISSUE: This and all the subsequent assertions are broken due to flat review bugs",
-     "BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev etc home lib $l'",
+     "     VISIBLE:  'bin boot dev etc home lib $l', cursor=1",
+     "SPEECH OUTPUT: 'bin boot dev etc home lib'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_5"))
 sequence.append(utils.AssertPresentationAction(
     "3. Review current word",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev etc home lib $l'",
+     "     VISIBLE:  'bin boot dev etc home lib $l', cursor=1",
+     "SPEECH OUTPUT: 'bin'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_6"))
 sequence.append(utils.AssertPresentationAction(
     "4. Review next word",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev etc home lib $l'",
+     "     VISIBLE:  'bin boot dev etc home lib $l', cursor=5",
+     "SPEECH OUTPUT: 'boot'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_2"))
 sequence.append(utils.AssertPresentationAction(
     "5. Review current char",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev etc home lib $l'",
+     "     VISIBLE:  'bin boot dev etc home lib $l', cursor=5",
+     "SPEECH OUTPUT: 'boot'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
@@ -63,9 +62,9 @@ sequence.append(KeyComboAction("KP_6"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
     "6. Review item below",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'lib64 lost+found media mnt opt proc $l'",
+     "     VISIBLE:  'b64 lost+found media mnt opt pro', cursor=5",
+     "SPEECH OUTPUT: 'lost+found'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
@@ -73,9 +72,9 @@ sequence.append(KeyComboAction("KP_6"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
     "7. Review item below",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'root run sbin srv sys tmp $l'",
+     "     VISIBLE:  'root run sbin srv sys tmp $l', cursor=6",
+     "SPEECH OUTPUT: 'run'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
@@ -83,9 +82,9 @@ sequence.append(KeyComboAction("KP_4"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
     "8. Review item above",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'lib64 lost+found media mnt opt proc $l'",
+     "     VISIBLE:  'b64 lost+found media mnt opt pro', cursor=5",
+     "SPEECH OUTPUT: 'lost+found'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
@@ -93,41 +92,41 @@ sequence.append(KeyComboAction("KP_4"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
     "9. Review item above",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev etc home lib $l'",
+     "     VISIBLE:  'bin boot dev etc home lib $l', cursor=5",
+     "SPEECH OUTPUT: 'boot'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
     "10. Review next line",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'lib64 lost+found media mnt opt proc $l'",
+     "     VISIBLE:  'lib64 lost+found media mnt opt p', cursor=1",
+     "SPEECH OUTPUT: 'lib64 lost+found media mnt opt proc'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_6"))
 sequence.append(utils.AssertPresentationAction(
     "11. Review next word",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'lib64 lost+found media mnt opt proc $l'",
+     "     VISIBLE:  'lib64 lost+found media mnt opt p', cursor=7",
+     "SPEECH OUTPUT: 'lost+found'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_3"))
 sequence.append(utils.AssertPresentationAction(
     "12. Review next char",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=3",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'lib64 lost+found media mnt opt proc $l'",
+     "     VISIBLE:  'lib64 lost+found media mnt opt p', cursor=18",
+     "SPEECH OUTPUT: 'media'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_7"))
 sequence.append(utils.AssertPresentationAction(
     "13. Review previous line",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev etc home lib $l'",
+     "     VISIBLE:  'bin boot dev etc home lib $l', cursor=1",
+     "SPEECH OUTPUT: 'bin boot dev etc home lib'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_7"))
diff --git a/test/keystrokes/gtk3-demo/role_dialog_flat_review.py 
b/test/keystrokes/gtk3-demo/role_dialog_flat_review.py
index 63082e1..467eb33 100644
--- a/test/keystrokes/gtk3-demo/role_dialog_flat_review.py
+++ b/test/keystrokes/gtk3-demo/role_dialog_flat_review.py
@@ -175,58 +175,57 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
     "20. Review next line",
-    ["KNOWN ISSUE: The value is not reviewable",
-     "BRAILLE LINE:  '&=y All Pages Copies: spin button $l'",
-     "     VISIBLE:  '&=y All Pages Copies: spin butto', cursor=1",
-     "SPEECH OUTPUT: 'selected All Pages Copies: spin button'"]))
+    ["BRAILLE LINE:  '&=y All Pages Copies: 1 $l'",
+     "     VISIBLE:  '&=y All Pages Copies: 1 $l', cursor=1",
+     "SPEECH OUTPUT: 'selected All Pages Copies: 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_5"))
 sequence.append(utils.AssertPresentationAction(
     "21. Review current word",
-    ["BRAILLE LINE:  '&=y All Pages Copies: spin button $l'",
-     "     VISIBLE:  '&=y All Pages Copies: spin butto', cursor=1",
+    ["BRAILLE LINE:  '&=y All Pages Copies: 1 $l'",
+     "     VISIBLE:  '&=y All Pages Copies: 1 $l', cursor=1",
      "SPEECH OUTPUT: 'selected'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_2"))
 sequence.append(utils.AssertPresentationAction(
     "22. Review current char",
-    ["BRAILLE LINE:  '&=y All Pages Copies: spin button $l'",
-     "     VISIBLE:  '&=y All Pages Copies: spin butto', cursor=1",
+    ["BRAILLE LINE:  '&=y All Pages Copies: 1 $l'",
+     "     VISIBLE:  '&=y All Pages Copies: 1 $l', cursor=1",
      "SPEECH OUTPUT: 'selected'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_6"))
 sequence.append(utils.AssertPresentationAction(
     "23. Review next word",
-    ["BRAILLE LINE:  '&=y All Pages Copies: spin button $l'",
-     "     VISIBLE:  '&=y All Pages Copies: spin butto', cursor=5",
+    ["BRAILLE LINE:  '&=y All Pages Copies: 1 $l'",
+     "     VISIBLE:  '&=y All Pages Copies: 1 $l', cursor=5",
      "SPEECH OUTPUT: 'All Pages'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_6"))
 sequence.append(utils.AssertPresentationAction(
     "24. Review next word",
-    ["BRAILLE LINE:  '&=y All Pages Copies: spin button $l'",
-     "     VISIBLE:  '&=y All Pages Copies: spin butto', cursor=15",
+    ["BRAILLE LINE:  '&=y All Pages Copies: 1 $l'",
+     "     VISIBLE:  '&=y All Pages Copies: 1 $l', cursor=15",
      "SPEECH OUTPUT: 'Copies:'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_3"))
 sequence.append(utils.AssertPresentationAction(
     "25. Review next char",
-    ["BRAILLE LINE:  '&=y All Pages Copies: spin button $l'",
-     "     VISIBLE:  '&=y All Pages Copies: spin butto', cursor=16",
+    ["BRAILLE LINE:  '&=y All Pages Copies: 1 $l'",
+     "     VISIBLE:  '&=y All Pages Copies: 1 $l', cursor=16",
      "SPEECH OUTPUT: 'o'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_6"))
 sequence.append(utils.AssertPresentationAction(
     "26. Review next word",
-    ["BRAILLE LINE:  '&=y All Pages Copies: spin button $l'",
-     "     VISIBLE:  '&=y All Pages Copies: spin butto', cursor=23",
-     "SPEECH OUTPUT: 'spin button'"]))
+    ["BRAILLE LINE:  '&=y All Pages Copies: 1 $l'",
+     "     VISIBLE:  '&=y All Pages Copies: 1 $l', cursor=23",
+     "SPEECH OUTPUT: '1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
diff --git a/test/keystrokes/gtk3-demo/role_icon_flat_review.py 
b/test/keystrokes/gtk3-demo/role_icon_flat_review.py
index 953670c..3f30aac 100644
--- a/test/keystrokes/gtk3-demo/role_icon_flat_review.py
+++ b/test/keystrokes/gtk3-demo/role_icon_flat_review.py
@@ -28,34 +28,33 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_8"))
 sequence.append(utils.AssertPresentationAction(
     "2. Review current line",
-    ["KNOWN ISSUE: This and all the subsequent assertions are broken due to flat review bugs",
-     "BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev $l'",
+     "     VISIBLE:  'bin boot dev $l', cursor=1",
+     "SPEECH OUTPUT: 'bin boot dev'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_5"))
 sequence.append(utils.AssertPresentationAction(
     "3. Review current word",
-    ["BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev $l'",
+     "     VISIBLE:  'bin boot dev $l', cursor=1",
+     "SPEECH OUTPUT: 'bin'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_6"))
 sequence.append(utils.AssertPresentationAction(
     "4. Review next word",
-    ["BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev $l'",
+     "     VISIBLE:  'bin boot dev $l', cursor=5",
+     "SPEECH OUTPUT: 'boot'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_2"))
 sequence.append(utils.AssertPresentationAction(
     "5. Review current char",
-    ["BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev $l'",
+     "     VISIBLE:  'bin boot dev $l', cursor=5",
+     "SPEECH OUTPUT: 'boot'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
@@ -63,9 +62,9 @@ sequence.append(KeyComboAction("KP_6"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
     "6. Review item below",
-    ["BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'etc home lib $l'",
+     "     VISIBLE:  'etc home lib $l', cursor=5",
+     "SPEECH OUTPUT: 'home'"]))
 
 sequence.append(PauseAction(3000))
 
@@ -75,9 +74,9 @@ sequence.append(KeyComboAction("KP_6"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
     "7. Review item below",
-    ["BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'lib64 lost+found media $l'",
+     "     VISIBLE:  'lib64 lost+found media $l', cursor=7",
+     "SPEECH OUTPUT: 'lost+found'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
@@ -85,9 +84,9 @@ sequence.append(KeyComboAction("KP_4"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
     "8. Review item above",
-    ["BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'etc home lib $l'",
+     "     VISIBLE:  'etc home lib $l', cursor=5",
+     "SPEECH OUTPUT: 'home'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
@@ -95,41 +94,41 @@ sequence.append(KeyComboAction("KP_4"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
     "9. Review item above",
-    ["BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev $l'",
+     "     VISIBLE:  'bin boot dev $l', cursor=5",
+     "SPEECH OUTPUT: 'boot'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
     "10. Review next line",
-    ["BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'etc home lib $l'",
+     "     VISIBLE:  'etc home lib $l', cursor=1",
+     "SPEECH OUTPUT: 'etc home lib'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_6"))
 sequence.append(utils.AssertPresentationAction(
     "11. Review next word",
-    ["BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=2",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'etc home lib $l'",
+     "     VISIBLE:  'etc home lib $l', cursor=5",
+     "SPEECH OUTPUT: 'home'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_3"))
 sequence.append(utils.AssertPresentationAction(
     "12. Review next char",
-    ["BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=3",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'etc home lib $l'",
+     "     VISIBLE:  'etc home lib $l', cursor=10",
+     "SPEECH OUTPUT: 'lib'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_7"))
 sequence.append(utils.AssertPresentationAction(
     "13. Review previous line",
-    ["BRAILLE LINE:  '   $l'",
-     "     VISIBLE:  '   $l', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'bin boot dev $l'",
+     "     VISIBLE:  'bin boot dev $l', cursor=1",
+     "SPEECH OUTPUT: 'bin boot dev'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_7"))



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]