>># 
>># Copyright 1990, 1991 by the Massachusetts Institute of Technology and
>># UniSoft Group Limited.
>># 
>># Permission to use, copy, modify, distribute, and sell this software and
>># its documentation for any purpose is hereby granted without fee,
>># provided that the above copyright notice appear in all copies and that
>># both that copyright notice and this permission notice appear in
>># supporting documentation, and that the names of MIT and UniSoft not be
>># used in advertising or publicity pertaining to distribution of the
>># software without specific, written prior permission.  MIT and UniSoft
>># make no representations about the suitability of this software for any
>># purpose.  It is provided "as is" without express or implied warranty.
>># 
>># $XConsortium: bttnrls.m,v 1.10 92/06/11 17:18:25 rws Exp $
>># 
>>#
>>TITLE ButtonRelease CH08
>>ASSERTION B ButtonRelease-1
When any pointer button is released, then a ButtonRelease
event is generated.
>>STRATEGY
If extended testing is required:
  Create a window.
  Select for ButtonRelease events.
  Simulate a ButtonRelease event.
  Verify that event was delivered.
  Verify that event member fields are correctly set.
>>ASSERTION B ButtonRelease-2
When a ButtonRelease event is generated, then all clients
having set ButtonReleaseMask event mask bits on the event
window are delivered a ButtonRelease event.
>>STRATEGY
If extended testing is required:
  Create a second client.
  Create a third client.
  Create a window.
  Select for ButtonRelease events on all the clients.
  Simulate a ButtonRelease event on the window.
  Verify that a ButtonRelease event was delivered to all clients.
  Verify that the event member fields are correctly set.
Otherwise:
  Create window.
  Set ButtonReleaseMask event mask bits on window.
  Verify that no error occurred.
>>ASSERTION B ButtonRelease-3
When a ButtonRelease event is generated, then clients not
having set ButtonReleaseMask event mask bits on the event
window are not delivered a ButtonRelease event.
>>STRATEGY
If extended testing is enabled:
  Create window.
  Select for ButtonReleaseEvents. 
  Create a second client.
  Generate ButtonRelease event.
  Verify that a ButtonRelease event was delivered to the selecting client.
  Verify that no events were delivered to the other client.
>>ASSERTION B ButtonRelease-4
When a ButtonRelease event is generated and no client has
selected ButtonReleaseMask on the source window, then the
event propagates, with propagation stopping at the root
window of the screen or at the first window with
ButtonReleaseMask in its do-not-propagate mask, from the
source window to the first ancestor window for which some
client has selected for ButtonRelease events.
>>STRATEGY
If extended testing is required:
  Create a window.
  Create a child of that window.
  Create a child of the child.
  Select ButtonRelease events on the root window.
  Simulate a ButtonRelease event on the youngest child.
  Verify that a ButtonRelease event was generated on the root.
  Select ButtonRelease events on the oldest window.
  Set the do_not_propagate mask of its child to ButtonRelease events.
  Simulate a ButtonRelease event on the youngest child.
  Verify that no created window received a ButtonRelease event.
  Clear the do_not_propagate mask on the oldest child.
  Set the do_not_propagate mask on the oldest window.
  Select for ButtonRelease events on the oldest child.
  Simulate a ButtonRelease on the youngest child.
  Verify that no ButtonRelease event was sent to the oldest window.
  Verify that no ButtonRelease event was sent to the youngest window.
  Verify that a ButtonRelease event was sent to the oldest child.
>>ASSERTION B ButtonRelease-5
When a ButtonRelease event is delivered and the source
window is an inferior of the event window and the source
window is a child of the event window, then subwindow is set
to the source window.
>>STRATEGY
If extended testing is required:
  Create a window.
  Select ButtonRelease events on that window.
  Create a child of that window.
  Simulate a ButtonRelease event on the child.
  Verify that a ButtonRelease event was delivered to the parent. 
  Verify that the subwindow component was the child of the event window.
>>ASSERTION B ButtonRelease-6
When a ButtonRelease event is delivered and the source
window is an inferior of the event window and the source
window is not a child of the event window, then subwindow is
set to the child of the event window that is an ancestor of
the source window.
>>STRATEGY
If extended testing is required:
  Create a window.
  Select ButtonRelease events on that window.
  Create a child of that window.
  Create a child of the child.
  Simulate a ButtonRelease event on the youngest child.
  Verify that a ButtonRelease event was generated on the oldest parent.  
  Verify that the subwindow component was the child of the event window.
>>ASSERTION B ButtonRelease-7
When a ButtonRelease event is delivered and the source
window is not an inferior of the event window, then
subwindow is set to None.
>>STRATEGY
If extended testing is required:
  Create a window.
  Select ButtonRelease events on that window.
  Simulate a ButtonRelease event on the window.
  Verify that a ButtonRelease event was generated.
  Verify that the subwindow component was None.
  Create a window.
  Grab the pointer with owner_events set to False.
  Simulate a ButtonRelease event on the window.
  Verify that a ButtonRelease event was generated on the grabbing window.
  Verify that the subwindow component was None.
>>ASSERTION D ButtonRelease-8
If multiple screens are supported: When a ButtonRelease
event is delivered and the event and root windows are not on
the same screen, then x and y are set to zero.
>>STRATEGY
If multiple screens are supported:
  If extended testing is required:
    Create a window.
    Select for ButtonRelease events.
    Create a window on the alternate screen.
    Grab the pointer for the first window with owner_events set to False.
    Simulate a ButtonRelease event on the alternate window.
    Verify that a ButtonRelease event was generated with respect to the grabbing window.
    Verify that the x and y components were set to zero.
>>ASSERTION D ButtonRelease-9
If multiple screens are supported: When a ButtonRelease
event is delivered and the event and root windows are not on
the same screen, then same_screen is set to False.
>>STRATEGY
If multiple screens are supported:
  If extended testing is required:
    Create a window on the default screen.
    Select ButtonRelease events on the window.
    Create a window on the alternative screen.
    Grab the keyboard for the first window.
    Simulate a ButtonRelease event on the alternate window.
    Verify that a ButtonRelease event was generated on the grabbing window.
    Verify that the same_screen component was False.
