def assert_focus_path_unordered(self, *names):
    """
    Wrapper of assert_focus_path that allows the actual focus path to be
    different from the given one, as long as:
    1) the focus order is always the same at every forward cycle
    2) the focus order is always the opposite at every reverse cycle
    3) all the windows are selected once and only once at every cycle
    """
    unordered_names = list(names)
    ordered_names = []
    while unordered_names:
        self.c.group.next_window()
        wname = self.c.window.info()["name"]
        assert wname in unordered_names
        unordered_names.remove(wname)
        ordered_names.append(wname)
    assert_focus_path(ordered_names)

    Wrapper of assert_focus_path that allows the actual focus path to be
    different from the given one, as long as:
    1) the focus order is always the same at every forward cycle
    2) the focus order is always the opposite at every reverse cycle
    3) all the windows are selected once and only once at every cycle
    
test/layouts/layout_utils.py