From 00a760a1005f48e101b3ccc78adf9e086563499c Mon Sep 17 00:00:00 2001 From: syeshchenko Date: Fri, 27 Jun 2014 11:59:19 -0400 Subject: [PATCH 01/10] Creating initial unit tests for each class --- libs/mockito-1.4M5.swc | Bin 170088 -> 0 bytes libs/mockolate/mockolate-0.12.4-as3.swc | Bin 0 -> 160767 bytes libs/mockolate/mockolate-0.12.4-flex.swc | Bin 0 -> 161099 bytes src/BBBUnitTests-app.xml | 268 +++++++++++ src/FlexUnitApplication-app.xml | 267 +++++++++++ src/FlexUnitApplication.mxml | 416 ++++++++++++++++++ src/FlexUnitCompilerApplication-app.xml | 267 +++++++++++ src/FlexUnitCompilerApplication.mxml | 174 ++++++++ src/Main.mxml | 4 +- src/bar-descriptor.xml | 40 ++ src/org/bigbluebutton/core/BaseConnection.as | 1 - .../core/BigBlueButtonConnection.as | 1 - .../bigbluebutton/core/DeskshareConnection.as | 1 - src/org/bigbluebutton/core/VideoConnection.as | 1 - src/org/bigbluebutton/core/VoiceConnection.as | 1 - src/org/bigbluebutton/core/ui/Popup.as | 50 --- src/org/bigbluebutton/core/ui/api/IPopup.as | 12 - .../navigation/PagesNavigatorViewMediator.as | 2 + .../view/navigation/pages/PagesENUM.as | 4 +- .../navigation/pages/chat/ChatViewMediator.as | 3 +- .../pages/chatrooms/ChatRoomsViewMediator.as | 3 +- .../pages/common/MenuButtonsViewMediator.as | 2 + .../pages/deskshare/DeskshareViewMediator.as | 1 + .../disconnect/DisconnectPageViewMediator.as | 5 + .../pages/login/LoginPageViewMediator.as | 2 +- .../participants/ParticipantItemRenderer.mxml | 2 +- .../pages/participants/UserButton.as | 12 - ...IUserDetaisView.as => IUserDetailsView.as} | 2 +- ...erDetaisConfig.as => UserDetailsConfig.as} | 4 +- .../{UserDetaisView.as => UserDetailsView.as} | 4 +- ...ViewBase.mxml => UserDetailsViewBase.mxml} | 0 ...Mediator.as => UserDetailsViewMediator.as} | 4 +- .../pages/videochat/VideoChatViewMediator.as | 1 - tests/org/bigbluebutton/AppConfigTest.as | 71 +++ .../bigbluebutton/AppConfigurationTests.as | 19 - tests/org/bigbluebutton/AppTestSuite.as | 9 - .../command/CameraQualityCommandTest.as | 93 ++++ .../command/CameraQualitySignalTest.as | 36 ++ .../command/ConnectCommandTest.as | 35 ++ .../command/ConnectSignalTest.as | 34 ++ .../command/DisconnectUserCommandTest.as | 35 ++ .../command/DisconnectUserSignalTest.as | 34 ++ .../command/JoinMeetingCommandTest.as | 35 ++ .../command/JoinMeetingSignalTest.as | 34 ++ .../command/LoadSlideCommandTest.as | 35 ++ .../command/LoadSlideSignalTest.as | 34 ++ .../command/MicrophoneEnableCommandTests.as | 132 ------ .../command/MicrophoneEnableSignalTests.as | 17 - .../command/MicrophoneMuteCommandTest.as | 35 ++ .../command/MicrophoneMuteSignalTest.as | 34 ++ .../command/NavigateToCommandTest.as | 35 ++ .../command/NavigateToSignalTest.as | 34 ++ .../command/PlayAudioStreamSignalTest.as | 34 ++ .../command/PublicChatMessageSignalTest.as | 34 ++ .../command/PublishAudioStreamSignalTest.as | 34 ++ .../command/RaiseHandCommandTest.as | 35 ++ .../command/RaiseHandSignalTest.as | 34 ++ .../command/RemovePageCommandTest.as | 35 ++ .../command/ShareCameraCommandTest.as | 35 ++ .../command/ShareCameraSignalTest.as | 34 ++ .../command/ShareMicrophoneCommandTest.as | 35 ++ .../command/ShareMicrophoneSignalTest.as | 34 ++ .../bigbluebutton/core/BaseConnectionTest.as | 33 ++ .../core/BigBlueButtonConnectionTest.as | 39 ++ .../core/ChatMessageReceiverTest.as | 60 +++ .../core/ChatMessageSenderTest.as | 56 +++ .../core/ChatMessageServiceTest.as | 33 ++ .../bigbluebutton/core/ConfigServiceTest.as | 27 ++ .../core/DefaultConnectionCallbackTest.as | 33 ++ .../core/DeskshareConnectionTest.as | 39 ++ .../bigbluebutton/core/EnterServiceTest.as | 27 ++ .../bigbluebutton/core/IBaseConnectionTest.as | 27 ++ .../core/IBigBlueButtonConnectionTest.as | 27 ++ .../core/IChatMessageServiceTest.as | 27 ++ .../core/IDefaultConnectionCallbackTest.as | 27 ++ .../core/IDeskshareConnectionTest.as | 27 ++ .../bigbluebutton/core/ILoginServiceTest.as | 27 ++ .../core/IPresentationServiceTest.as | 27 ++ .../bigbluebutton/core/IUsersServiceTest.as | 27 ++ .../core/IVideoConnectionTest.as | 27 ++ .../core/IVoiceConnectionTest.as | 27 ++ .../org/bigbluebutton/core/JoinServiceTest.as | 27 ++ .../core/LoadSlideServiceTest.as | 47 ++ .../bigbluebutton/core/LoginServiceTest.as | 33 ++ .../core/PresentMessageReceiverTest.as | 34 ++ .../core/PresentMessageSenderTest.as | 27 ++ .../core/PresentationServiceTest.as | 33 ++ .../core/UsersMessageReceiverTest.as | 34 ++ .../core/UsersMessageSenderTest.as | 27 ++ .../bigbluebutton/core/UsersServiceTest.as | 33 ++ .../bigbluebutton/core/VideoConnectionTest.as | 39 ++ .../bigbluebutton/core/VoiceConnectionTest.as | 39 ++ .../core/VoiceStreamManagerTest.as | 27 ++ .../core/util/OrientationCalculatorTest.as | 37 ++ .../bigbluebutton/core/util/URLFetcherTest.as | 29 ++ .../bigbluebutton/core/util/URLParserTest.as | 29 ++ .../bigbluebutton/core/util/VectorUtilTest.as | 29 ++ .../org/bigbluebutton/core/view/IViewTest.as | 31 ++ .../bigbluebutton/core/view/NoTabViewTest.as | 35 ++ .../model/ConferenceParametersTest.as | 33 ++ tests/org/bigbluebutton/model/ConfigTest.as | 28 ++ .../model/ConnectionFailedEventTest.as | 36 ++ .../model/IConferenceParametersTest.as | 27 ++ .../model/IMessageListenerTest.as | 49 +++ .../bigbluebutton/model/IUserSessionTest.as | 27 ++ .../bigbluebutton/model/IUserUISessionTest.as | 27 ++ tests/org/bigbluebutton/model/UserListTest.as | 57 +++ .../bigbluebutton/model/UserSessionTest.as | 33 ++ .../bigbluebutton/model/UserSettingsTests.as | 16 - tests/org/bigbluebutton/model/UserTest.as | 27 ++ .../bigbluebutton/model/UserUISessionTest.as | 33 ++ .../model/chat/ChatMessageTest.as | 27 ++ .../model/chat/ChatMessageVOTest.as | 27 ++ .../model/chat/ChatMessagesSessionTest.as | 33 ++ .../model/chat/ChatMessagesTest.as | 27 ++ .../model/chat/IChatMessagesSessionTest.as | 29 ++ .../model/chat/PrivateChatMessageTest.as | 27 ++ .../bigbluebutton/model/chat/UserVOTest.as | 28 ++ .../presentation/PresentationListTest.as | 27 ++ .../model/presentation/PresentationTest.as | 28 ++ .../model/presentation/SlideTest.as | 28 ++ .../bigbluebutton/testing/MediatorTests.as | 20 - tests/org/bigbluebutton/testing/ViewTests.as | 54 --- .../navigation/IPagesNavigatorViewTest.as | 27 ++ .../navigation/PagesNavigatorConfigTest.as | 140 ++++++ .../navigation/PagesNavigatorViewBaseTest.as | 35 ++ .../PagesNavigatorViewMediatorTest.as | 81 ++++ .../view/navigation/PagesNavigatorViewTest.as | 41 ++ .../view/navigation/pages/PagesENUMTest.as | 27 ++ .../pages/TransitionAnimationENUMTest.as | 27 ++ .../navigation/pages/chat/ChatConfigTest.as | 102 +++++ .../pages/chat/ChatItemRendererTest.as | 74 ++++ .../navigation/pages/chat/ChatListTest.as | 35 ++ .../navigation/pages/chat/ChatViewBaseTest.as | 73 +++ .../pages/chat/ChatViewMediatorTest.as | 124 ++++++ .../navigation/pages/chat/ChatViewTest.as | 54 +++ .../navigation/pages/chat/IChatViewTest.as | 34 ++ .../pages/chatrooms/ChatRoomsConfigTest.as | 102 +++++ .../chatrooms/ChatRoomsItemRendererTest.as | 70 +++ .../pages/chatrooms/ChatRoomsListTest.as | 35 ++ .../pages/chatrooms/ChatRoomsViewBaseTest.as | 35 ++ .../chatrooms/ChatRoomsViewMediatorTest.as | 121 +++++ .../pages/chatrooms/ChatRoomsViewTest.as | 41 ++ .../pages/chatrooms/IChatRoomsViewTest.as | 34 ++ .../pages/common/IMenuButtonsViewTest.as | 27 ++ .../pages/common/MenuButtonsConfigTest.as | 102 +++++ .../pages/common/MenuButtonsTest.as | 35 ++ .../common/MenuButtonsViewMediatorTest.as | 93 ++++ .../pages/common/MenuButtonsViewTest.as | 41 ++ .../navigation/pages/common/VideoViewTest.as | 35 ++ .../pages/deskshare/DeskshareConfigTest.as | 102 +++++ .../pages/deskshare/DeskshareVideoViewTest.as | 42 ++ .../pages/deskshare/DeskshareViewBaseTest.as | 35 ++ .../deskshare/DeskshareViewMediatorTest.as | 91 ++++ .../pages/deskshare/DeskshareViewTest.as | 41 ++ .../pages/deskshare/IDeskshareViewTest.as | 28 ++ .../disconnect/DisconnectPageConfigTest.as | 102 +++++ .../disconnect/DisconnectPageViewBaseTest.as | 35 ++ .../DisconnectPageViewMediatorTest.as | 68 +++ .../disconnect/DisconnectPageViewTest.as | 41 ++ .../disconnect/IDisconnectPageViewTest.as | 28 ++ .../disconnect/enum/DisconnectEnumTest.as | 27 ++ .../disconnect/enum/DisconnectTypeTest.as | 27 ++ .../pages/login/ILoginPageViewTest.as | 27 ++ .../pages/login/LoginPageConfigTest.as | 102 +++++ .../pages/login/LoginPageViewBaseTest.as | 35 ++ .../pages/login/LoginPageViewMediatorTest.as | 81 ++++ .../pages/login/LoginPageViewTest.as | 41 ++ .../participants/IParticipantsViewTest.as | 27 ++ .../ParticipantItemRendererTest.as | 70 +++ .../participants/ParticipantsConfigTest.as | 102 +++++ .../participants/ParticipantsListTest.as | 35 ++ .../participants/ParticipantsViewBaseTest.as | 35 ++ .../ParticipantsViewMediatorTest.as | 95 ++++ .../participants/ParticipantsViewTest.as | 41 ++ .../presentation/IPresentationViewTest.as | 27 ++ .../presentation/PresentationConfigTest.as | 102 +++++ .../presentation/PresentationViewBaseTest.as | 35 ++ .../PresentationViewMediatorTest.as | 86 ++++ .../presentation/PresentationViewTest.as | 41 ++ .../pages/profile/IProfileViewTest.as | 27 ++ .../pages/profile/ProfileConfigTest.as | 138 ++++++ .../pages/profile/ProfileViewBaseTest.as | 35 ++ .../pages/profile/ProfileViewMediatorTest.as | 110 +++++ .../pages/profile/ProfileViewTest.as | 41 ++ .../ISelectParticipantViewTest.as | 27 ++ .../SelectParticipantConfigTest.as | 102 +++++ .../SelectParticipantItemRendererTest.as | 70 +++ .../SelectParticipantListTest.as | 35 ++ .../SelectParticipantViewBaseTest.as | 35 ++ .../SelectParticipantViewMediatorTest.as | 94 ++++ .../SelectParticipantViewTest.as | 41 ++ .../pages/userdetails/IUserDetailsViewTest.as | 27 ++ .../userdetails/UserDetailsConfigTest.as | 102 +++++ .../userdetails/UserDetailsViewBaseTest.as | 35 ++ .../UserDetailsViewMediatorTest.as | 100 +++++ .../pages/userdetails/UserDetailsViewTest.as | 41 ++ .../pages/videochat/IVideoChatViewTest.as | 27 ++ .../pages/videochat/VideoChatConfigTest.as | 108 +++++ .../pages/videochat/VideoChatVideoViewTest.as | 35 ++ .../pages/videochat/VideoChatViewBaseTest.as | 35 ++ .../videochat/VideoChatViewMediatorTest.as | 105 +++++ .../pages/videochat/VideoChatViewTest.as | 41 ++ .../view/skins/BBBLogoSkinTest.as | 35 ++ .../view/skins/CommonButtonSkinTest.as | 35 ++ .../bigbluebutton/view/skins/IconSkinTest.as | 35 ++ .../view/skins/LogoutButtonSkinTest.as | 35 ++ .../view/skins/NavigationButtonSkinTest.as | 35 ++ .../skins/ProfileSettingsButtonSkinTest.as | 35 ++ .../skins/ProfileViewContainerSkinTest.as | 35 ++ .../view/skins/RadioButtonSkinTest.as | 35 ++ .../view/skins/TopButtonSkinTest.as | 35 ++ .../bigbluebutton/view/ui/BackButtonTest.as | 42 ++ .../bigbluebutton/view/ui/IMicButtonTest.as | 34 ++ .../view/ui/INavigationButtonTest.as | 34 ++ .../view/ui/ISwapCameraButtonTest.as | 34 ++ .../view/ui/MicButtonConfigTest.as | 137 ++++++ .../view/ui/MicButtonConfigTests.as | 19 - .../view/ui/MicButtonMediatorTest.as | 87 ++++ .../view/ui/MicButtonMediatorTests.as | 94 ---- .../bigbluebutton/view/ui/MicButtonTest.as | 48 ++ .../bigbluebutton/view/ui/MicButtonTests.as | 110 ----- .../view/ui/NavigationButtonConfigTest.as | 137 ++++++ .../view/ui/NavigationButtonMediatorTest.as | 86 ++++ .../view/ui/NavigationButtonTest.as | 41 ++ .../view/ui/SwapCameraButtonTest.as | 47 ++ .../view/ui/SwapCameraConfigTest.as | 107 +++++ .../view/ui/SwapCameraMediatorTest.as | 68 +++ tests/org/bigbluebutton/view/ui/VideoTest.as | 39 ++ .../view/ui/loading/ILoadingScreenTest.as | 27 ++ .../view/ui/loading/LoadingScreenBaseTest.as | 35 ++ .../ui/loading/LoadingScreenConfigTest.as | 102 +++++ .../ui/loading/LoadingScreenMediatorTest.as | 81 ++++ .../view/ui/loading/LoadingScreenTest.as | 41 ++ 234 files changed, 10529 insertions(+), 585 deletions(-) delete mode 100644 libs/mockito-1.4M5.swc create mode 100644 libs/mockolate/mockolate-0.12.4-as3.swc create mode 100644 libs/mockolate/mockolate-0.12.4-flex.swc create mode 100644 src/BBBUnitTests-app.xml create mode 100644 src/FlexUnitApplication-app.xml create mode 100644 src/FlexUnitApplication.mxml create mode 100644 src/FlexUnitCompilerApplication-app.xml create mode 100644 src/FlexUnitCompilerApplication.mxml create mode 100644 src/bar-descriptor.xml delete mode 100644 src/org/bigbluebutton/core/ui/Popup.as delete mode 100644 src/org/bigbluebutton/core/ui/api/IPopup.as delete mode 100644 src/org/bigbluebutton/view/navigation/pages/participants/UserButton.as rename src/org/bigbluebutton/view/navigation/pages/userdetails/{IUserDetaisView.as => IUserDetailsView.as} (87%) rename src/org/bigbluebutton/view/navigation/pages/userdetails/{UserDetaisConfig.as => UserDetailsConfig.as} (89%) rename src/org/bigbluebutton/view/navigation/pages/userdetails/{UserDetaisView.as => UserDetailsView.as} (91%) rename src/org/bigbluebutton/view/navigation/pages/userdetails/{UserDetaisViewBase.mxml => UserDetailsViewBase.mxml} (100%) rename src/org/bigbluebutton/view/navigation/pages/userdetails/{UserDetaisViewMediator.as => UserDetailsViewMediator.as} (95%) create mode 100644 tests/org/bigbluebutton/AppConfigTest.as delete mode 100644 tests/org/bigbluebutton/AppConfigurationTests.as delete mode 100644 tests/org/bigbluebutton/AppTestSuite.as create mode 100644 tests/org/bigbluebutton/command/CameraQualityCommandTest.as create mode 100644 tests/org/bigbluebutton/command/CameraQualitySignalTest.as create mode 100644 tests/org/bigbluebutton/command/ConnectCommandTest.as create mode 100644 tests/org/bigbluebutton/command/ConnectSignalTest.as create mode 100644 tests/org/bigbluebutton/command/DisconnectUserCommandTest.as create mode 100644 tests/org/bigbluebutton/command/DisconnectUserSignalTest.as create mode 100644 tests/org/bigbluebutton/command/JoinMeetingCommandTest.as create mode 100644 tests/org/bigbluebutton/command/JoinMeetingSignalTest.as create mode 100644 tests/org/bigbluebutton/command/LoadSlideCommandTest.as create mode 100644 tests/org/bigbluebutton/command/LoadSlideSignalTest.as delete mode 100644 tests/org/bigbluebutton/command/MicrophoneEnableCommandTests.as delete mode 100644 tests/org/bigbluebutton/command/MicrophoneEnableSignalTests.as create mode 100644 tests/org/bigbluebutton/command/MicrophoneMuteCommandTest.as create mode 100644 tests/org/bigbluebutton/command/MicrophoneMuteSignalTest.as create mode 100644 tests/org/bigbluebutton/command/NavigateToCommandTest.as create mode 100644 tests/org/bigbluebutton/command/NavigateToSignalTest.as create mode 100644 tests/org/bigbluebutton/command/PlayAudioStreamSignalTest.as create mode 100644 tests/org/bigbluebutton/command/PublicChatMessageSignalTest.as create mode 100644 tests/org/bigbluebutton/command/PublishAudioStreamSignalTest.as create mode 100644 tests/org/bigbluebutton/command/RaiseHandCommandTest.as create mode 100644 tests/org/bigbluebutton/command/RaiseHandSignalTest.as create mode 100644 tests/org/bigbluebutton/command/RemovePageCommandTest.as create mode 100644 tests/org/bigbluebutton/command/ShareCameraCommandTest.as create mode 100644 tests/org/bigbluebutton/command/ShareCameraSignalTest.as create mode 100644 tests/org/bigbluebutton/command/ShareMicrophoneCommandTest.as create mode 100644 tests/org/bigbluebutton/command/ShareMicrophoneSignalTest.as create mode 100644 tests/org/bigbluebutton/core/BaseConnectionTest.as create mode 100644 tests/org/bigbluebutton/core/BigBlueButtonConnectionTest.as create mode 100644 tests/org/bigbluebutton/core/ChatMessageReceiverTest.as create mode 100644 tests/org/bigbluebutton/core/ChatMessageSenderTest.as create mode 100644 tests/org/bigbluebutton/core/ChatMessageServiceTest.as create mode 100644 tests/org/bigbluebutton/core/ConfigServiceTest.as create mode 100644 tests/org/bigbluebutton/core/DefaultConnectionCallbackTest.as create mode 100644 tests/org/bigbluebutton/core/DeskshareConnectionTest.as create mode 100644 tests/org/bigbluebutton/core/EnterServiceTest.as create mode 100644 tests/org/bigbluebutton/core/IBaseConnectionTest.as create mode 100644 tests/org/bigbluebutton/core/IBigBlueButtonConnectionTest.as create mode 100644 tests/org/bigbluebutton/core/IChatMessageServiceTest.as create mode 100644 tests/org/bigbluebutton/core/IDefaultConnectionCallbackTest.as create mode 100644 tests/org/bigbluebutton/core/IDeskshareConnectionTest.as create mode 100644 tests/org/bigbluebutton/core/ILoginServiceTest.as create mode 100644 tests/org/bigbluebutton/core/IPresentationServiceTest.as create mode 100644 tests/org/bigbluebutton/core/IUsersServiceTest.as create mode 100644 tests/org/bigbluebutton/core/IVideoConnectionTest.as create mode 100644 tests/org/bigbluebutton/core/IVoiceConnectionTest.as create mode 100644 tests/org/bigbluebutton/core/JoinServiceTest.as create mode 100644 tests/org/bigbluebutton/core/LoadSlideServiceTest.as create mode 100644 tests/org/bigbluebutton/core/LoginServiceTest.as create mode 100644 tests/org/bigbluebutton/core/PresentMessageReceiverTest.as create mode 100644 tests/org/bigbluebutton/core/PresentMessageSenderTest.as create mode 100644 tests/org/bigbluebutton/core/PresentationServiceTest.as create mode 100644 tests/org/bigbluebutton/core/UsersMessageReceiverTest.as create mode 100644 tests/org/bigbluebutton/core/UsersMessageSenderTest.as create mode 100644 tests/org/bigbluebutton/core/UsersServiceTest.as create mode 100644 tests/org/bigbluebutton/core/VideoConnectionTest.as create mode 100644 tests/org/bigbluebutton/core/VoiceConnectionTest.as create mode 100644 tests/org/bigbluebutton/core/VoiceStreamManagerTest.as create mode 100644 tests/org/bigbluebutton/core/util/OrientationCalculatorTest.as create mode 100644 tests/org/bigbluebutton/core/util/URLFetcherTest.as create mode 100644 tests/org/bigbluebutton/core/util/URLParserTest.as create mode 100644 tests/org/bigbluebutton/core/util/VectorUtilTest.as create mode 100644 tests/org/bigbluebutton/core/view/IViewTest.as create mode 100644 tests/org/bigbluebutton/core/view/NoTabViewTest.as create mode 100644 tests/org/bigbluebutton/model/ConferenceParametersTest.as create mode 100644 tests/org/bigbluebutton/model/ConfigTest.as create mode 100644 tests/org/bigbluebutton/model/ConnectionFailedEventTest.as create mode 100644 tests/org/bigbluebutton/model/IConferenceParametersTest.as create mode 100644 tests/org/bigbluebutton/model/IMessageListenerTest.as create mode 100644 tests/org/bigbluebutton/model/IUserSessionTest.as create mode 100644 tests/org/bigbluebutton/model/IUserUISessionTest.as create mode 100644 tests/org/bigbluebutton/model/UserListTest.as create mode 100644 tests/org/bigbluebutton/model/UserSessionTest.as delete mode 100644 tests/org/bigbluebutton/model/UserSettingsTests.as create mode 100644 tests/org/bigbluebutton/model/UserTest.as create mode 100644 tests/org/bigbluebutton/model/UserUISessionTest.as create mode 100644 tests/org/bigbluebutton/model/chat/ChatMessageTest.as create mode 100644 tests/org/bigbluebutton/model/chat/ChatMessageVOTest.as create mode 100644 tests/org/bigbluebutton/model/chat/ChatMessagesSessionTest.as create mode 100644 tests/org/bigbluebutton/model/chat/ChatMessagesTest.as create mode 100644 tests/org/bigbluebutton/model/chat/IChatMessagesSessionTest.as create mode 100644 tests/org/bigbluebutton/model/chat/PrivateChatMessageTest.as create mode 100644 tests/org/bigbluebutton/model/chat/UserVOTest.as create mode 100644 tests/org/bigbluebutton/model/presentation/PresentationListTest.as create mode 100644 tests/org/bigbluebutton/model/presentation/PresentationTest.as create mode 100644 tests/org/bigbluebutton/model/presentation/SlideTest.as delete mode 100644 tests/org/bigbluebutton/testing/MediatorTests.as delete mode 100644 tests/org/bigbluebutton/testing/ViewTests.as create mode 100644 tests/org/bigbluebutton/view/navigation/IPagesNavigatorViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/PagesNavigatorConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/PagesNavigatorViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/PagesNavigatorViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/PagesNavigatorViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/PagesENUMTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/TransitionAnimationENUMTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chat/ChatConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chat/ChatItemRendererTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chat/ChatListTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chat/IChatViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsItemRendererTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsListTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/chatrooms/IChatRoomsViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/common/IMenuButtonsViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/common/VideoViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareVideoViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/deskshare/IDeskshareViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/disconnect/IDisconnectPageViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/disconnect/enum/DisconnectEnumTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/disconnect/enum/DisconnectTypeTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/login/ILoginPageViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/login/LoginPageConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/participants/IParticipantsViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantItemRendererTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsListTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/presentation/IPresentationViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/profile/IProfileViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/profile/ProfileConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/selectparticipant/ISelectParticipantViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantItemRendererTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantListTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/userdetails/IUserDetailsViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/videochat/IVideoChatViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatConfigTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatVideoViewTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewBaseTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewTest.as create mode 100644 tests/org/bigbluebutton/view/skins/BBBLogoSkinTest.as create mode 100644 tests/org/bigbluebutton/view/skins/CommonButtonSkinTest.as create mode 100644 tests/org/bigbluebutton/view/skins/IconSkinTest.as create mode 100644 tests/org/bigbluebutton/view/skins/LogoutButtonSkinTest.as create mode 100644 tests/org/bigbluebutton/view/skins/NavigationButtonSkinTest.as create mode 100644 tests/org/bigbluebutton/view/skins/ProfileSettingsButtonSkinTest.as create mode 100644 tests/org/bigbluebutton/view/skins/ProfileViewContainerSkinTest.as create mode 100644 tests/org/bigbluebutton/view/skins/RadioButtonSkinTest.as create mode 100644 tests/org/bigbluebutton/view/skins/TopButtonSkinTest.as create mode 100644 tests/org/bigbluebutton/view/ui/BackButtonTest.as create mode 100644 tests/org/bigbluebutton/view/ui/IMicButtonTest.as create mode 100644 tests/org/bigbluebutton/view/ui/INavigationButtonTest.as create mode 100644 tests/org/bigbluebutton/view/ui/ISwapCameraButtonTest.as create mode 100644 tests/org/bigbluebutton/view/ui/MicButtonConfigTest.as delete mode 100644 tests/org/bigbluebutton/view/ui/MicButtonConfigTests.as create mode 100644 tests/org/bigbluebutton/view/ui/MicButtonMediatorTest.as delete mode 100644 tests/org/bigbluebutton/view/ui/MicButtonMediatorTests.as create mode 100644 tests/org/bigbluebutton/view/ui/MicButtonTest.as delete mode 100644 tests/org/bigbluebutton/view/ui/MicButtonTests.as create mode 100644 tests/org/bigbluebutton/view/ui/NavigationButtonConfigTest.as create mode 100644 tests/org/bigbluebutton/view/ui/NavigationButtonMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/ui/NavigationButtonTest.as create mode 100644 tests/org/bigbluebutton/view/ui/SwapCameraButtonTest.as create mode 100644 tests/org/bigbluebutton/view/ui/SwapCameraConfigTest.as create mode 100644 tests/org/bigbluebutton/view/ui/SwapCameraMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/ui/VideoTest.as create mode 100644 tests/org/bigbluebutton/view/ui/loading/ILoadingScreenTest.as create mode 100644 tests/org/bigbluebutton/view/ui/loading/LoadingScreenBaseTest.as create mode 100644 tests/org/bigbluebutton/view/ui/loading/LoadingScreenConfigTest.as create mode 100644 tests/org/bigbluebutton/view/ui/loading/LoadingScreenMediatorTest.as create mode 100644 tests/org/bigbluebutton/view/ui/loading/LoadingScreenTest.as diff --git a/libs/mockito-1.4M5.swc b/libs/mockito-1.4M5.swc deleted file mode 100644 index 06420461529c7591e6434303e7724b84b2e1f5f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170088 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≦;*9cZsS!H{|H;WjE|uB zYbf#wWW0vrucOEpk?}gJEV~SFI=_HoA4BPnp?2{DM>Zc7lHWhwToAIHT9~!&Fb#Ni+6AGxjDj-o;dAVQFzHbu=-bV4Sx1RQWSN>Doy$PJYuUwr+YF z%w+*mZe4{A;(b`Z1kzvomonLfIdM;xvUg6t$*J;y0-CSa?l3DybEVSPWCr|OVJPc? zQfE?Gey&U>c^fiYD`gT`%Kqr^@MP$WfA_`h>-=O{ycTCk>2!Vp%HoC(#in*k>30ay zZ)IO8e;Yz%sGLkoN~j38Y{M(Nf!_TK^V9r>zza{TOuich^OtaQPe9@@QZdjcUTSn<(JBkGQk)lAGV9r~1c>6C9FN`W z3yW~}rcc{4#+xgDE#jpX%+V21RmEXurx{MCVfx|o>6t63 z=`|BiF}_oS9AM$L;sgef4lxixu%H0*UXWj_*kJ|XHW&i|K0))@W5TM+ohW^B!gpm6 zSOcL8XHS>X-9FH#cD48P z_bWZ!-96y#?sT$giOVV`XHyy+d|y~tyh?>x#96hYeSoDN=;-NI`g=Rum7cDi0kxx} zqrFep3wjLcGl*)>Qu-XFF-m7CouhP~`Yuwu zD9*F=W<=4u;rNejR4GkTIz{QbD84}PCt0&Tji~Y^MAfe#>V6aHUqNy}=wq-SXRUYPu%B0C%|S66pWZy&1L6<zu%si8YgqCk@8iRg1Nlx4OFra(a#+$(VB4_dK~=T9VE-Tsh=Xycmv>JFhR5I^s$ivn!3wQ(2v8iN}5^H z7dVb@o%DiiUYFyJyx}lkl;b*N3B7s4(9M?sL{)*3y)5~cSaS0#a?F$Va1kfA7knMD z@NaU0x=)acD|6PvP=8anO-$Oo)XvFyy4@>b`%ng5$c0e!x zEC7TrJHfnHXxR&fy+YULG%!Up=j4803N_F9c|ZWXRoq(*-Wu)=a<}##_QUR=F6p!E zBj`rp_Q>G&VsQJE&tmh-9N_szU$b^Y@sy>C&9v{62=}W#$6DRd|U%0Qy)iR!Si4XT4+o0hH*w6!;XQ z<$o0h=>U4#m-fdtr#FA~#-+I`^WR`!13*?M31C}KQ2|>0rz~|di{7G9^WQ=#RRQ)Q z&70u$-w3oY|4OkthRs!8(^(YVgrQUZqO?^RklSX!0zzi~YIZ2+LoH?m$r7D^?-w&zbh~%&&zIV&) z=`-RyJa2p zyX!mXdu1K;dmDGq_bYTzt@-;Rd#%+$Ke%rPxvdWRq1{1$xM2r<4m#+Mc?W&p>Y(4b zZwI-*E;{H>6yGb*SXNom0|E*FSm%bz;=TlHHo}%WbxvAtNwQ%UWSlk;5 zh#p%($QNQkzpj7)n-wG%(cdvge`j2I!%KJX;_jc`9sTLu^#6aCJ(zjLcLfOgi_#aw z)+WW5V8LL;#{3u%;bla8TnXPTkkH0r{*@Az3IuFr0jo+F-K+XI;lyjsgs%|*G{QL(soI^B}bjqD%I|k_DIg1 z(q5^0r_?5?PM52lG1yXvgm+1ul5dyPC9%(>TdJy)dL(}x*d1W}U!O$1QorPBlm?{W zPH9kb@09jQ#3?-@d3Q=W7?-*Ze8?ScL)*ugkn_?Vg>e|@?-lcH1vnww)J*Kr^rNha zT;$sPdj-r9aRf5Pl*s?6nE$9if)zGMe7DX2rmUs|`8Nv^r9dBWK8@1Ls`;|Ys(lLY$!c+!x%DOS2?N~CS=PUl$73Nyu%cFQ)Lx? zO^r3=SAaW;Hh`{^OT|R{s={JEt=h&cfn$zPy}zo&ASRlr;#%{>_@XK zqI5~0R?S~hIU`bHRfI1(U%wPkV8Eyc%`d2&?|cu;x-2oP{7rSp3H6!3rpAWT!+~Qg z>N{#-LXu<}?%pY>YuO%ZuwK$re05751W?Nu+25ZdFbaO?}`UXq!mdfYJ^6X&d z1P18sVnb;902IM}qu>(_`*Ji2MQVKh_$w+_Euw zNK(Dh7?GW9V3M8ExTG~ohb7twdSoi8Vz2k7?AtQ$s<9*KBR8W*LB-6YP?h`>y!uy( zKq6#g5)2A~J)x}hDsz_*xR>PDnA?b7C+2H}eQUSP91-@rw!zT&7!gAwsqnFpj~-)0 z=7?>s%NieVvGMV7vJ$u^Nv$#S201IW&YYFb$WYuTt>T^%16=tXE67ye!*{QqLFw8$gLWj)Hk=68pq{?<6Cs^&DXHTO^!u_9IOUb7gC0`_~ ztOvYUQ^{M<1K$!oz#9*}Kw->&i@=x#HztGoF8pm`ep}FLeuuyazQK*?{051g%&$aG z%Fu}S@%cmfF3a#9^>>K*U7kTTe}}Ac#hcZ1b;if0II%s-u*Ud0c)QKBK5>wmHz?Kj#hpbKc-TCuW|2W!D>lI4o!+J`wYc`y^w+yhUt_ zul!a2h=3`0#wII#PoRoD!C#TWsQ3Ufe@wVpZo%=Z=3f&&I8+!MTQt@D8%S)G$>)a# zIm0HI|AWA6%H`GnPFQVbtKH`z=08Ds${}>}nG5w>)zcD!aiGFDz+RW@46IdWC1t1N zx4{lvW-=CwHKrTe!Nx9kIM~6{EJi?QJSlH1vVIa&+(0cGE*bcRsLc92*jP#8yF4wP zoX@C}aDP=v9?vV}Xj%N#2Awl*}*Aa(*!xC0h4m&Gh8DO|1 z9lK4TcUFtXfIyH`DT) zmkx0yW-KxR!dKKKU4JXz>WjKTgO0VZ)ps43-`1+@*Ke^UoUNcykBzj(4c7QT!MGh3 z3-0hwOkjk)uB`jKvWW|sHV|bm$cSf7CoYK3YgCf9mwsN5c5q!?F9;62ZjstFH{O`MAgyla&WiwpDo z&e~B-;3y{WOqMm2PKuVgCQF*?nJjCobF$c2uCpfeRK;btz@G-dZ4AB0Wn~rBQ>$oR zeh1*I_iI(bpzJ`hZGoV{I{aTRKZ{%qh<*$>n8TwG`D+w22~q4}eO9Wsw`?WnGO_ z_WNL%urUSygcK)odoUmfGmrM*9wGlJZ_=qG2Uww+!@;(Vn$w9{@f1sLg^fm)?fKb= z2ucJ?PBwxSFHguusjF6&Javr{_VW-npouC=8j&SOfEUBYB0<#%*ZA2e1f43xK4eSn zJ&wYo2A4|#_55ZwkVm9t8Eix56BryNNmdhV0ZS?g0{Wl{nj`@3A7bPA7|XA>x?4#r zZPi-A=U{(7(|>2T8Tw6_BgPO{SXEUrP*C|~gBVmkYYHl#`I{?g2b?6m1p1nw@Ae zdBYD-0d{mC9S}ePB07*a0JPF&M^~k*I81;QU6nVgShNSCEjR|RH7TVeuvX9xW(&9@ zKz@W}GQ7sl`9x}JiGA=_OO2gxt|=HqE{%RT$sg(H!`Ut`rG(8ma`K{o%78oO+1Z85 z83BD-Uod{nriYQmndu9l;{&=qi~fr|g-E?0G7eO1WE)HyOQ6(wdT}X}9bvOXDm5>P zAD*A)IqeD3wz(ZxU)}b~g_k}&2qN3jhqE!grqAG77;c1jJU|si+Q-RN>vI(Y$&nA%B z1T-PA53+^6CQ)wAghLZ@?tqJ`dc^%rmAJnVI+s}KdYhQdLg%vCY{_4qgA;1v>!k96j7QTsgnx-i41j5rR2v!$tucck+h#CiFoPjv|9bAh_?GaeHnmmT zDq@I~By<g01^dLFo9AqEDIYgl0Y zqCg!vHc<(VqQD?qOf)FGC_&j`a{)6*wb)#wf#rsEY_9G@!fb<15C?r=9~ z8Q^ySsz=R(y!8s_D=~bhR2U_&(RkpIF}!?bV!1d2jMMm~Wn5r@HAv65jt;^9LI#Tg zCgnxiFaV@Xx*n%gmh^e1Cb4T3ba2Thjb4B7y(LeN%Cc`X0oX{|L{ej zhB*T!w?Hd>N5%YuWwp@@sVql?DGO!Wn;_fdXwW8FVz2{VJKMr=4xN1zY+6AsS7B5k zRpR!KkR;$xRYfWpQP>_)1V)s~yJf+DuWmVDfe!#>m3rtp+FQAW8)kHHsGj|aDI>K3 zJ`aB4=n=ut-lO*`jnwj;XmPi=bt7Up_*~ch+5fVaY>i`({3_JPKLrkq!`7z*h1D=n z29q;9JCn%hqNw>))-_#16`w8&gCB6sxG2-i6kFO@3@ajIiIdh9;~-@ zMSLOvaob;vbR?#ykEQ^HA|r;>`cb67i?R<43iGL@=v_cA!gGm>&XRVqH&mgU+!spv zC?gLJmahQoXM2)aN-|nKGno@YHcptiIB{z1EEumnHc`49xKdZLsrl&)Pve~ew^+3{ zlM(9e3Trw58$|&&S)a*R5KZdy^Wp@BuN%-!W5s@T@JF7*#l2Q0zQ3%3C0LlTC}iL! z2;J7)GII4;K`i-H>cZ%ii-Gvgr{m`ziS2GVzxVtjdv~9IEUcuiq^9)qkL=vb0v`*@ ztsynT-b7aCVr%f~N>HZCtaVwSPmbvnYw}`hdgLk^q#R~%Dpf#o()o*qbbcV|*g}?z z({kxtoLXGe5>xD3$}B8;FBFwep>!w9Xg_P05{omiQo2~80$mzQ!5=jK)g|V$7T(`6 zHZ2IDTu$@Fl2WY{9IbKTG8iGS^FpRV(qakVqtK~rekzzjrlU5(QFG7b0N~iEKV$5@bmOAIHFcB`o!benaoU*BWIBlXGV^U z?I)u5w8a#g$L43R>fqrA0^(Qz!ki@?>#n#4)onCYdc=uaPzyR#cde#*g4UTruo}CH z=Lvvrc)7S*32Z~vNmV#akhwW2cNLXuJVB(_A~;jP{7ixJGX=DTqOBBdqclWOBc)(b zN)IDFf*AizQ4^)j6mg+LeHYbQDc-~F9kx-eovIy_al^^?i&b zdW2%1=TYQ&9C?P=<1ob|6z`|>0HvdpMkzk1A3~ln7Bx<_!xSH(+A;kkqRJ_%Oi<;t zeg=8YBK--LfD0fhPg8tek1?v^luqi;Fi(Qgq&~$K>uE|;l%^@Yz{M5~N@pm2mV+%m z2U3Z+mTL14FNJZ967r)Z1w<)J`A31&2xwtV<1#Xkr3Iuq74^p;0e1a% z2#i{Uu1~3!nX)RRUhyWfes-x?-S5~7AbOY`%V$Rik z)G4>bT=}RAL19TH?T&gRR%FbZRHI%51t&?`7nVG3mch>g{b*T*<5N}v)R?59D#m^$ zDI^odwpgMn1cX2w+YiR7AvRhqFH;|DW>QA9)g&EBC0Zl5 zBptCJ_XlNehsqHHAh0?V-2@NmdVZ7cg=beF_7x*SvUigkFEz0KaCl5g$ibyZhO zQmcIZR%~~Ace*uuJI~_aW+oq&M3U$p7Mr({%Wp*YAeJJwcO|+P!JR43*OujXQ=*9M z?HGx*udI%@%SmON$b36Mx#6-E)>fO5<)yN7zlw-X-486=tzn!-}8D~i|Z}6*J-Vg98tSkLc2&4>TMc|l@q(@qh zj-cg{TPykKeiTM&4bpSOxm8FlNlrk`dmfsluz`7fir7u!nU6!}+pCayxl2H&4g++m zRZ{DT=m8jWaDz#cDuChD+F*FBs1;5YVHNS#YSjN91RUN97eLTd$IFU!M+o8scuo~R zT*hEj$QWRdF@PT(exh>@_&Er|m22cBL)YgNxJ>0=@gczZGZ-l;B#{1i+5CEb4CwA| zJr^C9uY+jAEd0so!_@;Ixf0t7i7a_0%toQ8l0Q14M^K9;oTrpXB5o1*ejgS1egzti zuctv=CzAWoZ~_t)XgGmId-0#ZiHNYUW#6XXdB^-N&V=lqdI zPnXssuc_xdYub7SDrhUKK({K;?@<91^>0K`2k}SHH_>;{(PJN#za#&aeDv5q$)Cn= z;G@T!XW0ZMos;OO^n~O*C_O1TqS8~65|N%}%Zqeg(yaSvO8TIFh&Fin_Fv*pKWnJFZE{KGP|lD-fUsF-ek z7IJ~j2nK?nOH-OP1gCUXxj&ztxi%H>O~SYeB>g*psMxb?J$a5*7JU|Frkw0S%mXgw zo3-aUck9)pGdd@|!N}&dyTt6{jZGyzNpI3UK82wnNj>S~<1^s*e~P_~faZ@y*$fq% zPpT`?c{#R_UPxbDg+a}dD&tWdj`^J~z>Q;TPK9m|#E_CEPtkn(c^;}Iwbu8&X$xGj zhxfCodx}jNt;=X#u%l8pEn3~=j2)~%rIS<1R^jo34iHCRe5<+-$aLFeK5lUgK%FY6 zBeBtyq{50)N{b@nqi~+(x6h(3!3^9E4xB|T@k5tqH!{LBHqWmt?cmV~r@FO1xAJbzYV1_up{@!gHHu`6WuPlH_TKJLoyb~FH2q4SiJL7jDojo1Yenr-$ zMn_L4Tx#e+m*!|a(1 z-&oYin;Pmjb9WnZICY9Ngmi9miSzCbII%}%#+Jlg1UB`X?WP0tNSroYB+(!5((*ZIur-iwRYJig}Oo$x;a!`^1W$$dnzX zz!)g8fL?mq@8r8^)!IeFwUl);&-P*zyM%2**0UhQ0@qFUW{vH_6}U~|@v=DlWqU?= zwwgwxhf}n~mFTz!L+Dnc3Y%!>~nnfGm$`nr)EvtO8 z!Zu~jt(7ijifPHj=^i*_s|7g{TQ^!w_?msHS^+LJImnOENu^*a&Re=vcu{&%H=QQ zx|o{cQ!WU=SXN$A(;N>k{Xc`aG@QB4UM+#$Te~)p;rYzv)Z*ZS*SaGDbs0LBcp@FRkjUqAN_===dQxs&& z5w{b8*z~Xr*TniVnkU3`nCINX7{lDCRQ47M zRvJ>49jMHK2d8S|Hf}ih>g+6{w&I;sf!mRtL`tp>Fi?he;dg$|x12fa1s|!mZ z7`LfxD7z5K@WfX`Lh3EV{?8hzP{JznaXPiY*wHIlC7XCI)p6fJvzA(~m@QZm(Prhs z%%xP@&(L#_-fLI0U(nL?GvsH3*UD9q$@ET?7rpmqC^|7ey>94?54>E^)PnEx;M}LN@)=x>+)Lc_BPxYGa9=@DdOg-=fd+uROuHIv8 z^BI=$_Z^jH*v`KGE~TTlr`J*PDRp+WcPbry-F-?&e{Vl#UxL!v-8mpG(E-uEeba^& z7O?Jny83j+9uc;6aIy_VP}^F^O+^xgZcorOp>S^T>g6iQStlWnciVD3 z@=M|6?cDrGi@d9K_a5%Hakrhjo!sr>ZZ~&(x!cd(eW<=c*T7^I(rUmEw-g-a!j40d zgRKy?V5b{XuKBNMuzsj@!<@q#k~T>oAC4%hhs8uI6L$d_(IDGZMA+_TdmNpW3}iOJ zE{B8S!};kvi*12JAo(q@)4kW+%_U=SSgLlgolI*?X?2Y&YzMP9EOC=3*KWgknZCNR zgJm(>^KifrC8)*R+lgiW-`%~dVNEu>fH~w6FlING_SU3BW>3gI#Rv0={jj&HlKRcT zoB4!l?mK9S*uXC6QAY3MH-*HwqV8rPBapgY8o7fS&;j#6%ylzA?vj^Xx6DytFWk*Y zh^}y}Apv|HgW{|LuueV(S++}K=HWPv`SRmFWKi?SOmc!o=#k3)USau+kM~C1r>k>h8{e%jj{${RPKZ=D=)6^?WfvGjSdg=-hbI>Tth~A zDQ9O=m;EJzK!e=op*2A{3)P3)t3Xh}BEp7<+I8O+77B0_d>L2K8*bnI;6-GL@&O?C z$HjRmcf;*X_brAe)VRBtns?ZqaC^&xWo2oVsfCMI2{_^Q$o+G%bX>&9Ib8(lcbE9X z?Pyo)eTyl{prtH%6Nl{yw_9f(_iu!qMS<0efb$@YfOL*o0bCDq61KDy&SV$S402cu z=>4m=Gdi;iEK>MeA0SsDv65yV9cEk$zA`ua$bEC#m|7LS+5&*$JvoghejWf@l?JUX zR;_gRc6F&89X);BO8)?5K$^cme~;4F*UmAnI=Ypf?tw1Gj`X)HT>}H{1)wV@Oi>nQ z;XT2)fEDRey1LtYmEP`-KBcb{0J%E42mI?O3apdk< zb*a@_4Hr!b*4Nh8)dhnw>_nyVDJ@*in{zWD>g@!yD>a~3A&TqRs;_TGRNbbBkiG*r z7^=4DyO6$@#kT96h`M|9UIY+WgZd+gOOb>?-UN4Y8IvZ8H&a|i@h;Bu?4SyWis(FuoOh{=7dy@@Rnhz3MpHM zr5dDe8kPZFrjq-iS*5%sU9|+9NmfhHO46&fo}bV&SJ4i*y>082CMZ zOa*ULMQM2%3po%hK#m9nDgCFQK#%m4d0u4kFvcua$P`M*=44!nsrhjg8H)J~KZ;-s zbl?tSY_G8VSM!34LqhVI>dh=LYirbRLRm{gJ|JbyOECwFyfUOj9V|I(2GSWT%S!V> zX&(kFOs|54J4q<;P`#0byo8{zw^(6Yq?eHSGUA1N7!46#ilhNK)lk6apn%V#JlENF zBQ8?oNzhx7uTbhg zLaG1FDm8%kWuH~5Stzv)nZ;5~Wd6M<^&ioYuTW}LD+(04>_r(~o1BkULzh+AjlCw@ zjqQ@I$>s-TUd)T~P(U=c8e>A=$AUh~#iib2+Y0k@a;zp@a|1*`%rD5GVHyoehwh+0 z>5K9m)Q`R_x2onBD zULaJkz;s>BpWMA`eoF?^gf%u5e^R94e=DKl&jb~l1QmHs#VSyd2P#%esCcVD#VwnP z9~G(C#HmG3md`=Ko`n1prN^oSz25 zh7qG{5dC*X*W>a(0d@GFW%IwwqK3>Z^Pgl;OK4R`5G&FAXIWqX?BTlbL&{HN^CvuQ zQc2fBRpw9S)%7j3D${lXq@#@mupJ9JyY_pl1qRm6vbQYD;My#Sce;hO%RgUM{=PNkgR)Xt^;{JhdJkZ;Z`#btKZP;k< zn#^U2Z=hvJxKUsoF5_jS=q2}!T+dK;Ql(n2hAT$^BmgFLSrM1-s!MizJwERGxf`gF z_-_zV0>}hd9uf@YkVN478-godnV(Y81N_n*mz`ZHirV%zHfw=(QKVV`jbsjyYt1^~ zi8e8w2$}UaR~Tp1aC6nb=4ShjQXK8n#57R7;tE@Ev_n~#n3#TFx!${?)WbA_Zw6BoHGfxoOZVL0dAunj*SbbC6LU7S6fx=IqW zS@xr4z=Rj`IFd`*EU4>To^L3_yN@m|%oS9OGxa6p4VHIV_XG9*Tw*a}BxYfs2)j#u zR3#wwy=$WGIftD8InN)C#QxB~8Q5f*=88vB#`@mJYWgVw&E2Y;2d%o7JvSKt68H4WxYGhA)& zfmtp=)y6CrkKd5xf(y9+>1<-~=XkP0F+bXf-EYvhz&9ye_F zkvhDY^ImK*l7oWxf{p$*!GPtXGOEOZ{jt1(a=Ykj>zx9kKi9(^Er!~!xW03pu6t?T z!HRj+$pj15g**~06JtejL2)CeolVTnFm5X4TU$Kbri&77nK4V_4pxHoiubTCSgLof z^upp?!qP1Z2viuZS$9+zvFNx@OF+djF_kT8h|RF2N=k7}FN|eItxwfCSriK0a?j$c zD|J*=r8>nbQ#Lc|LMV>Si>^9f9SYXSNUJIe$0_zfp6axe;E7jgz*EZc>$M=&YC+r) z*Qs2pk#R;c9KFeKFu|qf5M%AVKAlQPac#HIp4^R+>=9R#NI_nXO`w)dc334Y5TOH{ zrxhVN2RM!1o9%E6B)&{lwxO{%37963oa4I&oo#$?=12J+Ua>{&{9U#}5^GCGY+t zWBU(JP8>fvdhXEZsnHUKs*KT6c{*QdvEkm{fdU70e-_C4{(=XNpBXtaI=QA^S7~td z(c@<(Mkfy(KX{Nd1FN?)N^GdlWvtqFuD}jvx)XRd3K&>(l(4zY1U-DfR^c-2|toNVQoj7gaoruTrW& zR86S?OcDs@x=WEiS6fbfG70HHP|M3pA0v{2frx5_F2YDj@C>~AX@pxY#Prj7FU z@Qw&~o4LD_ySuo%dym9__oCW>?g05ywfYnmmH}$OGJrfJ2iV*bJjLb=Ts4FPFgq!z z7Pv8$s9XlMuIwBf_IbNtpLbL!Tw>*y(c7BYcC+2=fU~a~fmbET?25~0q=antKoD?U zX~pan{8oaReT7iX?B}663mqtgI?O>H>SUq&3ZX9Z5gzJhp^p|qJ?3LP)XPF2FNFHc zAs*^yq5CaNJh?!uIGnFaR|#Uz#;X{yRpt{AB#1Ph6hyP^PZdIS^Jzge3q4;5b(%3j zGz*OvLfz)1Aex0fQwa5%2|+XqO%_7^=9D0sg{CcZD=Z}6HFH9s@Mz|9mH;B(K5OQt zSY0XOY1FbX!FS$r-iPmmIeLi=vFuEp+lU3+TPR?#QUUIx$JsP@ zboBJ_f#K7`3M2`Z1x=oQ^2F%m;n64guCt*$Zur!}Ge<{{ot~IHJA6t51_riZwdINU z6G&`pKp#h&oPK!r`Fx>W`zo~ymK8{`cQ!G9!4}Y0x%|DJO=Se=h58(Kx!E3J6iz)1 zA)C2nrwd%_Dg(P%C>qXq00uztan^;iWnIe#D1?DCglKJ@s!C?ZZf>XR&o=F%W ze8(i)SNkQsVl7h+`#pr)^(nhkt5~|CG^zmQD81VjcJ5Tpa#ydZkVkF5KcOv8L&jLh z?gUGub|y6)V*EPnJVKnF!O)?HZMEG*TWrZSXO9t(7lH>EEVfZW7$A1HpMHpMWW!N; zQ$9K1fxdR7v%kBqs=~NYI=cHh zabHij($(43uXOcxc2`%b#?~F{>~D9leU>Ze(6$A4277~pwS#bE4S*XmoHQ}!25D4w zQ#rup8@OFC90V*2yop-}+d`GC6ot7dvF%iCp*T#{J%G-E+d({naOqFnPw4>Fyj1I^ z_)&^mITpuZijRT0FML{`0N65zgk0{rWsj`6UCm%8%hSMiZ*_GY%l=)vk-P4ZYu#8Q zb#)`l-p6)J(teKBK?4zl^IDbf+RJxtWA;7bwJ{9 zPif4fvp)y>a{{p~AXLhn&GK$WHg07UE4}9Kvl5WjY7@?C-?I`p3kQBawT*G9q}^q-yoV4Q{Mr!1r$E?u+?EI48)5 zSxe1FlKKrU@bMS`pF;<5BReCE7M;-o0p@{1K9C53d=7K85XN{%9_BQotPM%6HIj6; zHUT1htDbb6QFvo|p)rT7#vEGZqP_$xPq5c;7+ymaG{i3*zJqol=IoZ4(~6IpNAoMu zYP4L#`uA8;xfE!G9^R{*Fi#|v)o2hwM)PD+y_7%W5xGjLyr(&C1_d&up z#y10cIyTdw$bSfJ?|-bmLEa+CZfUE8>Le9AuyO;w`WYL^VjFyBHGppKm1gds$IuKk zk~!`8xjX1_W%dplQs-Hl$whNMrj2V7|5`4x*RJK$p=(n*$Er{2No@y|V=g9XI`z}tsen9w|ZMczQqXpNSG&BRx)*T`O*^5{e86s;)>wEFns+8t()i@~*gI}W?H(shmxzfA88F}~Ns^3# zH#K1oX9{Lq%;yF;W;0G4YYLJZk`Rj|$QLA`uo~gpDBpGhU0MdmUY~19L9Qu9a=@@& zV=a+nu%z@0OG^KD1JLbGa7)U`8xHeTWf4xXk@1;tnvS}TskX=D7zNJ7g#IWsSKy>K01l&R~tO;kfeh}n!z?}44R7I~x`1=JVm;d{gNvh6G;SAjzuCdNK4}-D%esym*Ec!p(?3Mh! zUz|vF(3L*~pc{6qpkl8V=AY&&fHvH}?Q~e3-8$@1V5!%pDsXDAyfa zXm|5hD=f4tSE*PV`O5N+C5CO{=5n5BT%`WGlTd@KvCgq3{JB}%TKwjMmaW!U9gk|m zHf!2F7G47g3hQoXCN9p*jLl4^1o@L=KR<*cz2Q(uwP6P&ozk4<{Gpe;Ff);vNrm0U zzr!aXJOtMs(FOUP4nyqbfkfK@(SEKcGSuA2aa4!nD_<2S6JY_dv--m3vsP+u`Ka$I zx#jij%F6PJ%(rUE(|Mw-_w$$wdC?st1oyoxL$U<#J*$>_*D4+7Z7g6UFJB4 z_FCKEmNA!Gaqhb8ORKoYUAN&ThZ5F5%7eDRqPq)i)rA_nk-%CC?{w z$;ITFQt*X|Px4c-4kjAIfg0zcOUG!K5EW)Dq$qfJ__;mU-v!#={%)%D0Fd+~c&sX? zX<(2B&eHffN`@&(Q8Gfw$Fw6&$tVqeLOaGN8K>j|4PNA$C(|^Lp=5@VOO#%QSq$|v zO0Q6Qm6AD1t^rh(WGNfJk{eWApq&O)Z_>mPCAX-5nFeoD^$t~6C|RZCF73KU$pcD0 zr|K7!Jfwb;lE;*+Q}To+^E6qc{t^vxg>$k&Ns}e|^hn;ERsmp2cR(H8_lznv8miOK zE)DNd@|=cW(C|wd-lyT8(D2V__~(@Tf|3TNiC<#s|B_Y0uP_b%22=I7?Dy|5rN764 zKfq$xuP_b#5px^3aGnVe#TN`>_Hogp{9X5KA~pmD^^ajg2qIs^G9-vql}ugCK-ebR zqb*A^hxYAcCt>po~#4ir5S2Iz}=ZQb*8Di~>6tDYF=g#LLRQluNy7 zqFH=L@8S|T{hksy`>+`?B4{)GI4bnTqL1TdhtYw!8j36hB>5j0#^y><0m+mDyR(tt z{KG^CyLwmpl$ktWBhA<8Gp~&<>@&OH7~QzhQG?PIn642ZQI6Z=_JlpjN_zpr zBCS_&9$tQ#l|Kcwd03G1odCc5n}AgN^gbXYkDikjm*gNcm#w%GiC-!5qL6~lgR{*1zhqJ~+N3o?5&nUC$qLqkL7>v2`NVjF%>3DZ;XyQrjJ(e* zqo4Rdqo(AXr6O?Io53x2)KZjvcu3N@yH zR{VyA{D`CqRH(;Fau;xZe~tC07^eN;=ec~RP<@r;D?mE*_6qilc652bKQQPE_yOTaF_IL_-k*d#k}SZB-0PzSym&;G0~Ja~T8-s~|K>CN zo^aWv&xODqF$NnBO=QVoZt~xVdVd&DO9u$C?HrumUIGBXUIGA6O9KQH00;mG05Nl7 zJpcdz000000000001E&B0ApcvVQg<_E_iKh?R{Hw+c>uF`>8trA(i*Ba3Kg%mEOC2 ziDz6pPI}w!?s?lqOSHoiN%T-u67OGs0A3_s0CIshDVa=7CypgzfeXOGx_;~3e|}%D z-hB0=Z4hpLdyCJ|+c*AZ5iWzx^PAt^?&7DvIdA{-KmPCkdAI$xcq6{M+5YzSa~!|S zXR~kLzMXl?@Xt@n_(F%c-kA8DRqVVHD>i)1OBo zavk`qWsy?$ixJ5E^Y%lTdpTLf2PWj-%_{rr-70vDyeK&A?(`S0Z(h9k^KWmnf1Pc= zJ-yAoArD!y^Rp?1(X%+7{yK_C z-E5x18mBB|D>;R2YD-p8r;Sr*2SW2AA@#czo_iEb6T;b_|M$*Y1y6y$l$$euZQo>s zi%a?F_QhLtdw&1)e+8SR$q2P~|1;PIkHIR4Upq}i$qMaeQcvVTJan4-@b@Tu@uT=v zvlFRuCsKz}hqw+UCOffAsw?}9w?Ooe*7l1(L>LC2H04i{g7IGjn^&ykm0`ZF(je)#Ogw_d#X>~9ap z(Z)y|MVq*q+d2?;4 zDyUwRV25z-V*Pn5>Y~};+H;g0h=WR6IvTw=R621t$+%a6Pz&USjns@Ag}<5BeZKTw zVoA8dXhzhGw#4DJT-&i-5TmP9+O^zgKi=ynm$@;~%K80P{^REA5Aj3m19#p=h}~ zau;pGDBE`xVQASJ`&AhF1UZ(*&@a#UEG0BA5t?@0N~fx`g6F*ivp@YPlObh|j=7G; zDPl9qxcswSqZ0(?2LkOXoc#XH=4-g{K+2f@(d{W%w0k{z{j!=}`0+R2-_#XnOQZ1F z+@-dS0cx`te!d?bpeM`kpD$u@H-FqofpIt6tKjL$k07%BgqKdg3&+#T3SNxd zLo>UPzP?NG(+BT0RJa~Fw=`-nL)an?LalC$y*H>vt6fLCx$-Mtp_pV^jNJYM11ql`p0 zK@3phGes{|TyBIa^X#oY2{kkkxiB5Q(Gz~}!>$VuA3u0;w^g~@ZQ@|<_un4Lp+1k} zD0tif=5jB-xOr~6vS%JDVTWH zo5E8@&#Mllc7Sei$zfs%a47(qzKJqpDm@H2p^VI!j!}w9b$Fi}^&Md}MrUT!cVp-G zP~6r1cUPy8u3p8V4i>2_?YOK-UPg~?VGwm|RyWM{())kOoe;lXhU*uxxeI=tp@M#T zJ7zqS&D%;NarPun>$foalG^GwGHi4oC-NsVIcyg>*mf-2ReRHgxgkEouEr^n(mC7H zNsaI#ohJ5#-(Tl9hQ@WTjZ>Yjm}&Cxrx%!oUQ#HJWl(C?_D*cFXxX&FT)o1~wYWvN z;S$%#!8m^Ae}54#o<%cn-XH#DzIc-Oo&OSUgE#~nf5@`5@8_w{>^9y#&hEt@ZR=}k zlD#m(mg72zYdkK>S3Z+u=Ss3&)>#z$rI8&;ueOY<0wY~Kt zoTYB^8+y9_9WH>{OwwP#LnTnTJgr~2Vx(3bo3`33OvJ}b{%6BIn-xk&^zDjcFe@E{ z!&?*NV&qtA$xJC`)U_>5@{8t-jcK@cJ5&Rhd6TWvy*wqpX0fP?lSIemPQtVg#_P}rv=&PQ0g)pse?LPXy$~n_JCMz)lApI?dvx7*Yoq2msOB%xT|pO1?~E6pHq9~ z%We4R%T<;CiFtnwmVkIk|EN>{RJe46jUUVBlgBPz&sTxh!zXPVu>$(ACdqv77-Fa_ z#FhUPYyvrri`O137^Hrqucsd#XHW~7G4G)}|5;dCKp$nBa4^1ct3?AnEtPRx) zHWE%9BO~3*n2P3uX^v}JI1(nO;eTEtp|;n{Mz|(f(_)-B7PWax;YfLO!?!m~IZe09 zy)StaDiTkb+5o^7<~CzQ^D5PhzbciZ$)Vz_-~0dC$y+#0yi5X{o{|TeYBXYThcMB8`)H>++gBMBd_yD*alw1Gr0EgfMRK zhUs^}p4v%pLat4kn7b$y!?p2%GA#CoMKPeLFy8|uI(o_7BtZbzQd7$DDWszB>mf5v zJH&BaL>NM9hcl-LQ%CH!Rz}bFL$`CMoUsm2c}fpH1Zy8=0+%!1lQ@8!r60W-`2mW< zoUPO1m~Ebwa$7EzfzRh-7~h7G|M1!Cz=QMngYN;V#q`t9=G}#nnFH$1UwN^=Jl|}; z30q5iVm{Q(=2IkAp>#G)$GG%Xt4~qz929~<@TX;b@v+17bFp$G!%z$VrGtP-0-TS* z=6TQ2`xk!!6B)Isly@Qcx$O1L>8Xzq`1xen{iR~z!9%3`?zmDJc4KHA>R@fnaGa9P z)5EC`p6Xt$=rB>m9_W`2QjGS`%F+HxDu^pl36#b5Ok9kN>1xnT5)2xHS_-s=fl~>F z&jd*7t$)xAu+r8zf854m-^NWl#BtRcD5F9@<%nydoGn>CD#DH2mp1x5Ei$-}kZ|yV zk7jg&F>{KB4!XjVk4ih#Ea_-|=f4QKDTPs*>H-}`zd|iOsH4e%X#(0u7a!)yV3Xu5 zmL<{VHOc&I6hxZBb;_jmM%`|bNI@9L#$>~%8vz8Zds@cfqeBSgvf-6n{w+#?}&lD8Csw+!2` zXB$yp!`MQYBF-?t8Cax$wx>T=)9=3V`XMt^V^)<&cP&j&ovMzL6fJ@*gEYYkrPI*Y zvTBS(%A^UK1yAWdVV|q3z%4>8Y*XwQ)?`$ujV{h=S7hPgKZ9^p*SSv3MmP>SWVyty z3J-}jrX9Ai&4uRPm`vJI&Uboh))5@{CHD`|aql38i9>ZTJFQ-(N&Ipu_sPjvuzz~1 zV5ul;VN9bSQerd5VGajM!TEuL`fZxfo6Hr6COK%D=|3b~PZljmPN2LRufu5V#c_SF zYXN*PcN~gb;zA*O8b|_E4Osf*$?W5D%~s}=ZK~R`)#>KM5-hfC8$s=#a%qu*@MsQ^ zQ*q#(OexQlMS}$$LRzk~qUBmegST~nnat)$m?8}cDA`KYjN_5kb_no+DZpSOKSAG5 z;gSCyg}awZ1{1fbqp@XdiRDC)t%tr%(DQ2J_i&49c~vKNDhZD{o13}J5YZGj+f*1z znDHjmUGd^DCbzR`XoRHR%eqd1LdC=PNh-1daA?;ZF=7s47f4C%L7LDjDzAdF2Pju> zZB63|f{?{*!gO%|$^zaaI(cfZ++gfiHGHb}9a;#>53#MWs!aR~18VODMi1#(J$Md( zkNg)e@+F-u*keeTX$SGsmmm@%RvitM+6ZqhMM>=qwJu_#0tdylxf` z{x*J){~XmM9!_B_y+IT$&T=jUPf!$tb2t55>av=58aHbH=EAs5V6F=t(IQ5&SH5b`s)UxIG;Ql-{!DGc+%03?uCNdPi*&>2% z3_FmE29C(wPng0MV+da6d8V^0Gchg1&0P*v9&)wCjS<4cv0MzOc2H)wmZ<{yavJil zm7{sfngcr>Y*B&{*R@t5Hb<_FaA$TFNDiLGGmQf>1uL#7)(+L!7K|~=5m!m0ZIJ;W zx7&EjLM^(H9o(&Y+${g9qupKTiE<1(cc}BFHZab&a#NJ;3vtGX*fxZ@n)o8JsDqgJ zPG|d~MD~|?(KyFn=0&y5T@v`ryjOQJNxR;AOJY@O6lX*TvWYI8=Fr1NNo87p)j$pJ z1m|+!->l^N`(06JD{Jr6aVU<6MQo}!Ira`l6_FMz;aY5^+i%I3E zyC{fXK{`BbAU@6cct{`RLi zOW@I(B=<(Q1IP1bRhqx0&Dbu&@XOkZzSP@|61Bc=F`L^$pNDlDtrD45Bn{Y-_0Z+; z&%pmy?-{C55IJF-iDL(9lQ*wXX%qdXJu@rx?!yRl(Uj&WXO=GOAP4DGn!=XetGc=x z1Z;{3V%)MDQ!O;CYg<~W!ggBJ>X9>C-s%?oiI!L#;{mGVo4+Z(E=HJ3HOSE@Nt`X^C<$$~K6@8&8{cO9-@GS;vfoN~p+(*ygeaf5YG>D;#orbu=N z*BlU33nJA`ms%sE#!3OI`d*AJodHdb?iYfVghC7tU5zlJW9$@hkHQ3at6W(mv5agr z)E=hXaTp~o1c$NKjA6iJf}T#|(i{)hLbv7y4R}uD+~}GaO4YzAYUCj!}~}xMN4-n;Whhf@%Mzyk`cqTam>Wqs#_( zY|6)ny&kX+#!0}y)vlXT`xRhSFhSI{ESH18l50I)fTHu^a}<6P`evECaM61wOy+3Q zZGa&J;pDrbrL)Wwcm{=CPBHDaxA+&hp#pJX1sV9Y9@#gsP1kjrGEXh^B&h0MHm^Q^TCzQT9!9-g4)mff4v+8K*&K#EMuO2XTLKN~ju{?4`N++PK6_uq zfy|>jpPt}gnN)0X%OW7asA7AeIz@ol+@n8H-%4mhnX2ku3Umfx?hx4o0{{=C>yrv} zAec3;p4#!VZ(t0C)1!n4YXG?bJH6Z?8R)S2%M<%=d9jN>hOrbOU;K8ByoagY=vNrQ z9aC+4JGMV2S!5+opSzktIrFcU>1!6lZJCGiG%E9hlGQIkk@E+;xq z7G*@%=0LzWOMSdmG`sU{7^WyS*Ft;ja{GGAbu^oZy0VPLg>0g>j@+PaQXiqzCEZjk z)Q8LORIp%g9r1K8iU#xL;K8Wx1xur?TT~*&V;5GvrZZ%Ulnp%LVju}K<$pg3Q(7r| z_Ite)jd2`~gw(M)QD4j!CRAA77zB7&6gw4i(2#b6&@zqD@XJV{JAWxEE+75!J@V?ow%}agHu8`$_||tulR}ukp?_i_}9z?nK&aW3Sq~UD4p< z7Gkc0lJ*-)&}E^3IFzIAfUqU9jh+ku;OHJ}G*2Cw0`OxfJKq#NcjT}LU^?YyA@K3$ zCM@Z@@@)>X?g+WCkvn4u??=dIBo3v&nqTLRwp3OR>6*{Utt6yMcJu8H*q8$#0v`tL zj0W5)%4jaiB)cyYGF6u#QfGP+OoTOMYumB49tk?Hk)BLufDhGvr4C7Ga=PUb7|4}f zrP#AnTRE%CUOj0Jcw!PP=Q{9L)v9>ch!X)9h3mDWD zq$+3tsHg6DU>!&p<2zkJ>JE+zDrAo9(^W7oywxhtlLpH|hf;1MmqC)=O9HG!Y&wm} zATO{_q$G>eKfcEPLR`l)sY;1eTlmUG?VM{e#VlL=-=$6?`c4wN%PGw(l#ZRLkTjZ2 zlw>KEg7~%e@{X>a0%1l8VogE!VyoFQk+HP+0b<5xDRWaN2UIGPX63TJi=v*Cxj+x?XwDTg7J5wAHg6 z+mWZ(K$Ms09D5ffS?gEf`NgF=Z(W_gViB9!7Ntak3|7rsKM-iQ0i~c%YSW-0hAGMj z8Yg)4i)?`O{F=>~v_Gh|B(;(HGP4Ncm?Pviwj?bm&Dror+5Q#(a%xu2l-TAKhqHy% zei2HTgSf+pz90;WrarAFv%6kg+b|zI>GEH#6njQ<5o3fXvYD>OQEks0D2!v`*THO3 zgWcS={&CSO$4FH0Hm`MKQq!+e{GPZLLZEEXqW?J|GOo|MtMj?lp9gSURNQ-40Q5anQMYje1T~kNEaBZHY|BGosXw{uDPd~G&Jv$n2wUxue{kTQfn4U$u%~lb89*uWdnOO;1HNH zhAqx@r>wx9e%t}2aK9Jl*@O00FGnJW3RNRlMWT}~(I3z7u?3#|%fx>f}h;1TAky}&j?9Ak%QjMeU~61phVo%$OY zOwp`I&ilYz^!;q` z_8YiY0&BPaEc>bcadQRjIc;2;0Pa@a&l=D_4eG$%!7}L8M4`l$!8NqnbFff#zrN37 zwr1RKyfE2#@Tbx~$mQ4h7{;(--Vz(%e^2FG@W1-h5zVvRn@QG@4T@a`#JFDrWxk~b za)=>DDa8&LaY#)K5G%_YJrw|-d$k-0v$hHbj}L)4-4%>pHIE8lJG?wz$%2lr@DO=& zn89qk>PwdP$+T|9+ubS-Hi=lRITkfQkQ5VaIkqn3sZ7B-P-#{56oo8Z&4 zCt}CzI-NJS!W+#59kh{PA)jYtz0SCc%Al>aOs%{rah57+ItmOrLYKXr=DWJO5lCJE6a4Z28ordZaUCm(=tRJjJ4iKAT z$__invlkTr!4r6UD_3sn?A56%4wZ@KmZjM&N`ENGby{)>jR;c)k^KykA*#D;YZjsi6TaG6+%KAleQMoLa7JAqX;{HsS&F z^4IiC(@4o}u-yim=hS49&asD3mhq2uX`YV8`ZFGr9zETU7yMB~+NNldny&@4KPn{* zb8+T@g;DwNN0(>H<^dI?^J3=!OIS9V?s1GUjJVyoiA04eXp1OdwTJA`(0oFtONx|l znKXf}<@r@oAuSEch>Nf-uO*XANJ(_AB-$8g7@#Qaw4m8)+)(C}bsa8~-sS@iQBn4j z? z3Id0|?*F>Jh=S#_eYK03+#4N{Vj=p%WIMo`N!Ll1h^q6V4&7i3Unl6i4bbn?sL^;8R=>Buhpxffl zCT8^9-%7Op)>aF;a0*7^h!C+Prk!I_x*hr~7&RTyJk#^iAF{texwP@GD2Nr{p^mF- z9Vj?&F{d5Ba9$XE$dFNo(nfW?CH$cRsu@7Xlr;X~du9j(CJ=JdR%$je?*yuI4+{NE zMg>2H@pZV{EXx3D`L4FG#+`#@15wJF-1urh+X}tz+!zERIDu2V{~UfxTKy;?6{#kT z*(NrX0CVjC2??ZPnaGg4dm_ZaeMCPwJ<5Q-rOC&k4!0;~qya=BJ!XZWr&XketAVb$ z{aLU zYcS+2Y$x^eI_IS}Wxh_a)f=S27KXc%eyGxb>P3;r?+@Oizf#{6Isj{n*+Tnv8nY1( zH${cY4|r8{1W?=qbJcpIXh7wNon(3HKvnwUgN^PZ{t?n|l@{r9@YPp19*G9s#YMsj zvRt>p1X5b{8JTf?0k!C@446%2<`?^BmpeZf+h%j2hwI|1j5-Vn#R0-weV^%Lso~1q z<^K!pXu`6)6%&e;X;q7)G48%9pS$V2Mb&8nIY}ue#I-pwJ)~876L@-H*H6+mtrGvM zl=E>%?J}dnl#%`Dv1VH}L>Seta_2vbi=lPT9IccrdVcuq)&09Vm!d@Da4B_M)0TyM zLet80Xu{E8h|xNvCPgs2iq+)kYFb?4N&sDr#|4apq?p2JnF8H{*gtXf`B=eYnZ;CT zFLeIRi)ujx<~o`_gyOJEZG-|)EEK(rGGYcAm_Z+;sk2)zo0`1pP(Y~52quWL1_a2G zqIL=B?mEyB9h>>E&CzlarcX61$9?h$MaAlOkq**QYzXl!UEQ!c{Bar^Ji9JsC^?Ay z<#ian|LRAtx#<8d`?JJ1Y^f_iOCnkcAKgxo>{+L?+~(*Tw-rd?);bX;(eMev4G1Vj zww&bz=T(A6+D~2!HcY?V78Psc^O(kMk`F%w;ul+WH!RK3B#tZeEf)hFay2?Xqf71+ zsJ}yk6{<>~m9%5V>w>#Fo$A`3zJiqVo0$= zUFtyXDJ3z08>;9u{}{&S*Sif2UE&Cf(@OHZGxcA#s+_#Rc&if@6 zu`P>Oy6%>xF^_T-)DFY6eW6TFNM~1b4%!-vLLLL^+O|g8s4tj0wZ1}o{(iGt_f_rp zSrK=;O&qNKJ^qF!DMHh>g<1}>ank=3niQcX_;aN+tiKEMb>lrtl|O|xN?=X=t=N3) zF!p~BU;cQhBrS1A*FXSs*AgtY9F0?Y{rxPbc2=S`FHt-GZBz_~1e;Hh3g1^3-jGvOHWreZS~)62Aror+ut*Y;E1Dk_fo?f!M-sM>Jn#vkDM-N8?3|%3$^IZg z`V`sLM}g5qBTKV`iP!!H;~6XJ0dmN3&=6%VP7n+lvm!lzbDgEa8PYf-WzPj-CCO`@ zER{OtlTn9Ag!1y4_Y1Zk>rB!r$Wi(f5>oc2g&TW_{dFFw6b%IS5;Krfm7Qfw989~0DXuNm6VS(cA6e#Y+ zt+;z}C|01w=>o;wtrQkGyg5I<_dEa2Ofr+qz!sNen1I#m#g2T)g*<-)4cGV=6budVw`q+53Mn61YgKY$iyVX`HeJrR5A>3=0cpEKfSFOg-M6u>YY6K3Ntug^Uw*&)^mTYCelSu_L45MV zXJ$3+I3} zFndz1b4cp{L}c|B>_D2no&uq2^!es`z;QOakG2^;R|j>o&-D^YI-C;=E$YB9EbKwK zvPL_aby|==cey%?&NkdhGMozxWtiMs(QL@RrkKd;Tk$j!3LApZ!HQQb6sj`g9m7L< zh&|qEQ%h?D#k*an2^+H8C^jc2KdR-Z{9Cwe1j+#X`)7IuZmDW5BLa$CXIH?qc~2Cu zN#w_2iY~cOo8|(FRMf?_uZ9ixPZRPRSXvdpV9NK|+9{}u_qm^fyUJ?^35#R8YRo2b z)cr3p2=jq8Bk76bLyfdD9i-&!csYF4U;45FE=aig*wM)s_tOlW`x*om3OUhr!wq!G z%e>AsB|S!G%$Xh$z#4eD#Cqt0CIZKt=F9mt&1X?a=`~v+tM@#f7k2eH)J;{2)|xkRHmZmTx<643<9J;@XT#JJi&|NOc=!9wgp$uV&Es88olMhD3z*TUt$<8{ zX{0=gpN2hn7|zh(tV`=t5!8#B5H)YgYDu8VF5_XcbtC0e782nI!sx ze*}oBlk(f;M;Yyu!13X^Y})`BF<|r@XtX&zosH5l5`|jRglei&y?jl6H9-423S+?X z=)R9-pq@;cjklwYDQLG$tRgI|M&2i~InKq$8`oe=dt!J>(8yDGzrO#*ISYIc(b$qk zkGaHzM0qY7v34`1tZr zy@%teJ*vlBrWAlN$2u=fXQRFoR&4;XE)rAwXq8Egv9V%Q5V#c>iKl=5?wLVZ`+_0X zY7;8v=8>b8WTsVSMSI7;E`u5%4okGZ-w`I)aV$mG#K$>Y`?FwW0(>+YYhx9cO08fq z|8Zz9BxMp~kRERNp^$_9C|rH(&NgeP(;s8`heF<>TLL?Gwfs27Ovx^# z&lSUL2Z^FGiLqKUK%KBiJFAh+_zwE9`vt{obeF+o?1(tiJI=&caBs7=mWk~pA&{})UEL3YY+7YI698&hy$3{d) zd6?bJAzL<$$*T<@ZCTRFsnaVXeZG@~emit@Nc5^e2$;#sltWd)PXsMr!teglV5;)* zk~L&Oyp6W zAxI_rs>JqFgrN)9uiSVRW09Vz59@X5;!9fk4qYcQnnq-NhCPFF?@Q)edHaegUTgLP zBVcH&$?=69)sI@}IWL(;VqDi=PoD@nmv=}?Rw9uY)?2mu73*B&=RJDf`5nd;1VHkP z;2k&CYr1&Zf;`+6$_L1p-(21yn_{6c{X)oXg)!&T%6;i0eAurwkW704OnS}(?hU7) zMaKDp)7j|>3w}W<7nq2W%eV;XiLKt))liC7SH<1Wy?unBVap=pee+laS>ToRoK^+i z9VzFWR(Z(uEYyflO|g*pHwu4IGar+hIEZsx#QB^f=DQq6yjHprU4$t!!N<=BpsQUP zApFH6t5)*>I7z$Dwt%eqqMGFpk#i+BjbL z3ZMm7!4uyU1P15%_8Ov^`c)z*W*wJdf2jF-Xw+_mL`or;id<#GN#wMblW08J=%kRz z(mC2-qcze%OM?Ct><;KScc&wBe4+h-#PH{37fXdmv^}#I}z5O`?AELmlC=4_$UdCw zH0)PvH%@rTZ?W<{rP^g#<_YlnjaIbgwi{*zr;=l;2XcZ%;j6}qU$hJL#W9*ZaSc0M z=J#LUra|1CT0r4ajw*m7NqdF$b~A5C@A+Kdi~Uq~>2tpyju#Y1lwI)7S?va^GNDkr+(ueMRqcjDaa_zNE#f=BXE@&8d%P_m30h(Vm6e+E%-J(z z3jU@(+2d7_G~I=Akj*Z=8|wnjEZ_akF<10m*>zd z5BKjxY;K(BD0lB&eM!~~Elorg-ig8?&-c1p<8jBD&$2pQlYGNrqy!T{%O>(`8)iHa zy;=plBB15BIdg~bjUox(RN*+T0K4tCm^vbj4qRWvo#_I+n5m6E0F}s-H^MOeb3RB(phRmhTGH6VA~2|5-2 zxKPVOLiviwC`^ePoP(?9 z-5t>5>O`XK$|NvzR5swdGL3nK$Mli?XMDlokes5YDr2GbQRjOpqwnFTHvt-E_A`;P z&fA)`gVNQ1OaCAT2Oft~2t%X19EIT%2{k{ku*$2;QXDk{*p16ZFhQ$wclJA*2k0eGra7~(9e+Ew@d6@7>XY9MQ)&kp#roS#38K8us9$xEI zXJ{veqv}*uB}q7w!@oxfYkcZ#7reX>LDoL=?@v=Jyl7dT=bck`w0q+*xL}vscrYG> zDIi@gs*PkPag7&RJ6Z6@oghzw@T`04at7}}65JB*UP5?a$tA=_C&_1ls1QlDZBCYn zC?82=E%j>jxZ|qy4?dDQM>B2DW%n2oN?IFx)9y>v!@~0=bGn+dH8BR|?8n$DxfRk{ zi{5D;Agb#j8hc<~(LsKh+2k3U%SO;^o6FSd-l{)Uh1sl%wpK8F{nnmNsoAeiU*5#$mT3gE z%C&cB7(f=-G$&F`Dcn-AUzc*lr&Yv?Fk>t>a^cYk4uMm(xl!%7o}AS59Fxv1wT9S3 zkTWc%w4rj0Jf{%WAdJ#EdBDIA^3Oc99m&o2JB~I8|I}$MS4c4`DQlP%()w_j+L&Sa z@n|~B&nvgVlS9#~EkPD7&(iF527x{ut=k!dkrGtPL7|2$=Q40*1^pg-3tr>Qh_O4@eO)kHr})YuN3v^koB zx&POe01<1BwpjPqO#evsV6sl3?QbQ%uN57Lj_>i!Z;*G=kMKXX?=Cq08NuF*Bflbf zW-C#jcGH-7$8t_5sam&VzZl|=MxZ2I1~!F@p~jvJ?&Tfdya~A*UT|ILb_+pO-a7zU zu)NVA^F#m6FTZ;u6vMj%dN+-Cyg#4**Zq#;m48Sb6s`KA->8;Qh~wR3zu&dKE$_1^ zvZC%UlGVl$ayDvfvZ>*E0#3%HhdJs{L}YkhlSnB z`t9)hRgn^yV;m%FR|Jf%6PB!BzbN2|g2MSu%=K?5yd-Uu{2X?MyQIN>UsyNnW_oNAkENyWM;;I%wCU!Xkumv+VjH*r8-HqpDdvgw!FW!@h zJ;1z;f2EAo@u>fP-h#XMF}yb$7j|hOs=J#vKJh<*n$fC8$N!j}4V6sV*-T1$7eq(8 z!Rr;n49$<;5##7CbvDMbeefUK9|+h~9BB4+LFwOAotX6zG)75CYF9}P+Iz-?Utf7? z3{=8`bf3236Wj8G{JL(Dv20^q16psW>7Si0IH2br&5nmxWADx%IuqsgT>| zYDR5JU0*3&waNQN1=NaJp94lnqPf*GdLqvJC7z~;LS6E5L;{PzI@R5#?6a}*s<6;B z-L4)}_}_pGf1?%avnkh+WqJ+somQ3}qJ z50%s)27_rVUt{Q~;8vIFIU;`vB&m~%{Mtn&^TRkl>59LA`5GBl>5dp~sg z>N2z6JH&)RUM*Zx4#{tYpT6Z>3M&Wp&6{;cb}J8y@G=Bzp|Vr)As~&0EEcHR|!3$`~ z^~Qg1o6V5^!(^*12b|$@1I@ca$?gLsw>o9?Pq8XJw1RA#t4qb3Y?W@5R(%+*{j9cn zE)dV0Lb+>t^D<9a8(#^V`mbx5o)}O95^#6N&~57CW9Z?_B+`t9F4V0R3|}CQDFRj1 zcBGglfcwN0wqD14E02p#uHcyG28`4cPLA5ZbX&?eBCxf*YH(o6`B|n1lQal{oaE^V zz$P*(Wp2{&M`EF`Vhvr-k$(m(Mrg`b13ID>6D3yzH}Ini8T>vwd_%uF$iLb8b{bM#8V!{N%&e zY}GHkf%kKNIWLM22eOVL>lPYXXJX1Oi$|3(26{q085!Sj3@W9py=@x{tRW3?6AI2^ z$P|7+Tc`Qw;=)&A7A%ku5O}Z=UVy__h=d6LK@R^7BmRRN{&#b7uynI<^8vVf+5X?a zf2+ZN2a=c}{+nF)WY^7AO zZW}QS-SZWM7B6nyZXJ9Mnk_@yAwhSZ#PcbUDOaML^zTdEor^PI8%C>15Fho(r$?>t z-**8Hl(LW9n9mHwy4>1NpzMxL;SsK$$n44t2K{QF_(sP`s_Q=lL!G^v&`p$C} zWJ{3ySk##6y`$Z#qN?NQ*nbcU(>CAWw*OIK*4%gHtd^)1Z%IVoUmsg%vyVe37Im`f z*y-e`8;TX(Yl&q?EP063)S08Mw!B^)$6kMk)$EJd`~gr)2MAw@oZfwjolEcSa;YSh*tz5`?ecQD@}4%AclYvgx%hqm%(EB8*ib?xR)<}}{qO$KWN!mR}GoI{PZ}_a%8wUHJ+MCO=i-~(WWRe8X4|3r=};8 znLWvK=f=l|layWa-8<8xQ^R*&OkPOsG{=+a(cR72h?FKXmKjg&=^dFGO4Y^3Q+L<3 z*7au7^VlK^MIOmkbWct*la#t?cxs~g-1OAQ`C-(_L{>a;ZW7Ak-1(vLvGizade8aE zJ13_uPV!h;D8(6`P9-x_`7sN!3INa4YwvhVJJhkw5uTXRnv zkmO6{J2Xkci$utPo|zcSH20spCEh=I?tDfnmYO6PfvwWb&8O3;>2&kRbm}5dV0tpu ze9P4Io#}JQ;Zz>f&cpW7)5E*6Iq!0FZc3(G0dEq~x?Om4Az(N9eB@+idTjEnM|jaf z(UwWu->HmEW?EL8D%!s4B(auN*6nnEr+R+%l{?+P>dKw&Uv=g7j%D<{Q&Z!qxdvDJ0xUdlneFf}&f=i|NUd}eGsZ4kJ3dOCTj;0G)S>`so4 zot<1)uy_}j$_oX1IWD2|DhCJ8P7P+J21ion*yI?^NQ0xP@pGy(An z%DJhu676W!c+Hiz)^>wx!n;I?bwqXkYb>M0Vy(U`zAMp4JFhZ*Jf)?p%dS8Dh_v!V zCxP72);9hQWKvpUopy?7yVBC$>C1M5;r5N(8PUQlT<)z3M`fm#=}gs`M`u2rg>+V? z%N4q^MpxGB$_8E8q$`_sWvi|<=*kXV*{Lhdy4qs2uppm07^W8)vxuzY@k)|n;PK-L zV8#hbisq5!()(qmFr}!tMAE{TP%7~-$zLtk)UI8}-8$}WAjM|ByX?eW6bE43?}<}B`;I_y%J+;pjXnF7VO0Y=n3^oGSiECC5?HD zdnFG;ZCQYo?1$&WT*nlJ9gw7e%$Qs}8~L4Vc@m{{w@RZW7Qw$%{vbs{^(R2Prp7UM zH)CF!PK}Ilf|s03U!-}mm-~DIMch(p#GXHiel9(EX7kLx(G;5fRiLb0qAVbpZ*20y zl%TH1-6TypNt*2Hb&Dj;D~Z%inckVIC>Yn*@0PfuV1$Jwih}D`64xUNUUr~fSGQ)H zzsx6e#%^nSNA0q;_K2n_u}Dk}YhG`-2q>@7sFDp`DK?6kN{EC1>I_B<1`FP0pX?6? zLfkFEK+=GmGT|(RV!#kqvMg3AS*-LYRKiNd#>$uS%&&!&CsG+;Us}}ELC*SXe7XEY zcRq`VoL3S$-g6;2em<4fICanm#V^m`*yKp+?yhA&Mt5FT&3V6aMv2C=)G#I|M|{cj z-A$9{Cx%kfHhC+{ONRQ?ceE^z0~_p>XLi-udotGC5{a}o51k(y&x}oajt$+B8qV0r zVx#zqhC|D08oa_WyX@Gyt}lI!v9+*gIeBbvjnOhqY47M%y4qWUd6CvS^m-V}?}bEL z>F8)t+B(~U8Vk$efEEfDRTg=Rt5`LwF7cL!!wM*Zs(Ey;;bU5{F7t88bY1c5aT3sB=jOOIBt)XsY zY@}{-DpNO|8cvN}NY&+p)=f?4{d`U zfK2BY7nz*U&;iF?u8)HVbQMYpeNtqyU;w zOM6&7*dv9oB3Vb9Sfi*1#FP2f(_Ypu(@r-~LVI7@ocovu3k?>c)rY&zP_fQ91!8T8 zb%tU2=Mv0hkC&E$%m-)rkNe^>_7=tH4XbD_p_=OBrA2rzK`4IQhahb3t%`)!7^tf| zq$!G3HH+neEFVBwhxJdg%<6})C(Erv@Qq}JbrXDlGHe}&A52zSN8lGFtE{7Q z$k(efRa=jIZ=Q` zgdAExc@RY`pnj~21yl|%X*vZ~DW`AEM^dy$>7O*G+*K23yTeOu%Es)@iJ5pN__xj3 zymw{u#tfu^S)Q8aRLE;QcBqdL# z1;O$UW+QqAc}B*dlfaKRCxtRNnf46cMMSPxlzzr7p`u_1c#famd$@mJ@aFR%Wae0E zgz8n66P0+H!&4(E|K5ER#JSl)_w6QZG)s>6?z^e?K;Pie-Xnb{@uSZVmiL{>vnh(k zx{X1nz5cOu|70dLZGt1tnmwS4;KW>eL%1WSI@#{c`E)toTcve_O{+Q6*kR5#Tr-nN z)VBF-Dzo#NF`f2M?5)>~J(;F>IZWEZ_}85M#w)9Zg8(bbJ&Pn1fBQ9S&5>wjQ8_|V z)Md&2(;r^B4CCzg&-v&!fmfp)Z6LgDtsu#rZ85ba($TK8MLLyOTdNZ5iYc*Zm)a7G zfHBTPg5MXSn*Xl~Gu6T59y$-rgd}BeUeMI0D zaKThvxlva@>Gu&~-X{pNE|phQgexm6Hq6*tbg5#CBvpX;RBV%^FvxM`c03@-zD7wZ z-^odHNt4_hjkIt##@$x#wsE(eyB*x^X?CwYW#BkeKG-o`-Qyuh|O%;01v%mzbgP zh(5VT3QNpix)($}uy!xeX%KzT`B3d%5O5G#5bbqDw2SkIw#Tb#|G_{Z%88JvQu$S; zF*qI>4nD_K=2hVs8XTXe+zJ!#pmKoCk20%jKps-TH&`>E%wfx4J)jP0qpDRipbdFO zHEZpFXGp&nECy`z8ye+%M?KcM0X-p`a>8qRO{2UPlx=;&m+&V%rY8|F17`4$U!FhY zlV^Oz6j(=rb7rWq=8-wG=n+clMgaBSI8c10uFQ*wo37kjj8AFR&zU8q6?oY^XO=du zBd2CQUZ&p5mlaz$5Wi8EVrv_yCOTc!h{3QO9pFI#4-t<9Ku+4JN=E=ZmQYLu zz#QssBr@&t~$yzp#(5&26H|PE+M0b}U-nq$| zsijm)l8vy>yK`w|UR=9BDEdmO=kyxIkE|ejL=)Y#(gbe5QUb&MwJa%o`gphmDa`F5 zml$$F*NQD?q^(Pd#<0MF%&dxw?PKzm^+}5HA0?3J9 zmuvWr6Z_FRz6bT|N`UV^v43sX-PtOL2oeV zuf3lI0ydEYO!97!q~Jz8n=nb$J-)C(FV z^V3o6#EBsJ0K_zGbE|`X&GS(rNI^l6f<%zucw{)b0>`VuF*GG=f&q z?A$z<(?cLZL%x39Dj8ryI%riXXq6YVs%$_RGC-`t18PE>Yb>8NJ&hHQ*a`GA(jm^R1h0sb0t+GP}(MtFl*AD4h5BZccjN?uKInURgZ%;ncMIW8Ygm?kR>Chf~v{c6mi&)s)Eh|fBxXoR5-n_2wneF*y zvB#c1<<6)!mPSV?(U!L2h0T)NA~?VfGp`>=?Bxg8V9#Ooju{SIxpJeNX@s&kn8ryq zj;*|Op6$cTg_EwJ94am<;cgjsE5LWtaBid$gG^XMrT~Ck)HRgjSKW%fQt$x$9bRabt_Z=-Lqe$Kwx(|lbp_^ zd((vn08pPsy*&bq$<*B$4(WON1rCAF0iG-^h&C;oizs>#QiM*X#!VrfID}K10IfDg zlM@hqOlQ_Em!a2b>axgxT^}vm)ddj4MtLRL7V(HqAjv7Pp*6zsaL8MPeFT`THlE8q zBfyNHtgFSk8a6x&P~DgTO$R%fP`yMhEibF!ZY6iC2*JT`RAdiFb_gXo$j)43S5@Ni ze|OAg-GN@t%1ykArt4S}3vnDjv5ProQ#_7mle zhDGtZ&rPS!C8tyS=v+0G4hT8H)CH2QD(>$ifBzWRbeUm@=@uS50iISI)TWEZ@=mnU zw?9kub&h7zMb4XDflz)0_?aJ<8e6^}R@+}rsUhb@6kk|Krh8GhH!p&0U13Ls@;}(J zgZ#QMG}|M2gM3lNo$=n%7Av;v=JZKgiQ$lJ0Z?g;bd@a1MQMq45)stB#W*4p<^@?) z6%a(s8kjFIQ*a?hqID2Wr1?V05=Sjd9DNCc<_oVqU%c5Sj+l@gZi2(rZtm~9i#Xqz zOZ%oKFshP6$~E0K6z65Y*CS-T39g-_v`;^IzcayF+PWN(YJ)-1g@!SzgTz${x?tq6irsFMX3CG)F!qqDUp{uh0a6Gtmc`_!-`@o> z*=>xCzgU#v?4qUB9#l%KvrF!374iYzuuNL{>2v-LZgjFeSjQZ-IHM05`K#l;UE`e zasqB#644jtTeutST~whl8=!7-%2}v|)3kg~HB;qjJa(_Ve!1<<8OrL!WO}lqU{~2A zBbT{*jcOGf_})nzz?1%zo=%K%NH=w#ea_ z`jMt&Hj>LPB@kvdhg&K`%cl<@emYr9r;{ZtY=!6O0PemS&l6VFd|lZ(9Qakwn>yrd zK73*Og;Gc;HCQ$Crgzr##tnAiptX)>Lr4>e%)mdr$||KzS6LOSw>A-DHy)7g{Sl52 z8>{0%R{vBv&2H7!=6j3L=EhoU%f0tLVQrh^vdi%hKjp*J>M~-B6MoYlNfeny+~JJa ztkg}+o?zXbPu@nuA?!z%*nn?na?|B)?Uqb8`7G?$mnsa%zl2!qQYo633NYMeLOo)5 zYI+2-N|rrccuT(8vd>LVK`tkg8WHNYDN#^r+HgC+gx>N>?sMz4qV6Yk;Jh*@!_;)y znbh={c_}aF>#aS{atwL*-F=QkxN`gJdh-@prlvz&2ifhYWoO&#LcArm;Y(qQGwZf? zb_7HfML#R;t(|tAo$gUOBQYD~v8 zl7;D9#&nMTJfuw_Lkd9_oa?RC)mme%n8Gn-(AE$ z`L%#~`TWAt;@Hb0QFq~_cRlmdC-^5QZ&$(cfXIGlhQU}aNoEZZ?4O!Qj!gz!)*gaO z2N#7G;qdwHOD9s$10EyBts$0;fE5p7F3JrmJSi;K8-=^K@MP?Fz5?oL^HF})@!k`C`-_t!BRtvR zF?>r19$UXCOIrB!l3k^+%(}D$j`B45G z!*|18stXA#m5A1GVdCM`IZPIQXho)`#rpzEzsgl7ECbM*4d{{WGU&Tf(e5I`A;{hf zv=+iFv4ARjQ+yo*S*pUl$7j*Pvo=;;LKP=ly7*v69Lf-Oo1M2#y6Jk0a+;#CntCSabd;vKJNhk`n@9Bc!Re-yd}KD+Y_#=IustLBJF<`JW3}|U_apS3EWR5sH;V~ zRzm8^8nmOzbx&B=s&s9Qu2t(=jjpZLwOUJ$TBGjU zscTKT)~p*55?AxI=$@GFhu}9tOV@Vm>;_%iqX%x(p(q{b)s=mEaKEng=~`S5 z#C3K+4;<7({d(XgJ#<(P9MMBZ^}sPbbX*VItScw=;3=J*(Y0H2?K!&kTwS|O_dicB zO6c04uHCL{NnIN#ocM{rY}<3yZQSicIYNpZa4^`Y%UuofdK^Eb3+GW?>26PpVhy zCT?V8GpSyAqGWGNoO(=&HI#y{C+W?QJ^eQWsT97n0XXONlTEvYC~K!Yp2y~b_o;!D;l*HN- zbF*{t%`Caa8lbnWEV<1ZoHHTMzAf2c-Ok^(L&tP0lB}=Hp!~*=X1x$~PwX^z-e;x1bMs^96ak~^b=v$E7|mf$%A`?9}Yp*VGIB~>05=q=--ozcw+B<~m zi5=>H*@xsVDQuoTKZ!+h^ATs=af1Km!cVjwa1JEP8{8yKB1!j>NyeU`9jPd1*HYzx zzNt{kPUbADuTirlTbW~LKx9$2pwRs&XIa{QU2V>x?V|W4E9$V3Vy*2}3##aTGUt%% z?(?wbh214q%#)B2us>V63Cl2Sa!HV=v=?R$huwsGlj+oom`Saz5GQYqiqip4IK)o} zK%1e}1obAO%|?*vaxr*1bRa2fGb+6)UfJ;b0wv^@^7k@ud5E3QKvXCu*e5vYB;vqi zkd++bfT6htSj>+LRXQ#tx=_RE!dgxT+#%pkXvA!f&`BeA_z+OsA@DhUA(O`L^K8E~ z+j~UnVSCT&jDzl+eTGPv)1Tc1(p?vmF>92<8K>Dw?pj=!Ga_=fX)CE?f#$AgKnS*m z*WL_I=dd&umAV{vz%!g2A5W#$6l_m@G!nh`f!s3N*Okv(yY2JKYmb}mCC5$KbZTPi zLMo2|u{_@dTC~#`i>F{&Y!cj<$&nMOG^9ZuVH3`bY!BS!@r=&@un$kIpz{6sweL=m z?I%nL*;%MSiP@Tg%f)NV`Aa@0aeeC|o{qbL%jFm5F~Q1g)Zt^y=4dS9-<0OHEJOVi z;w?A@iCf-nrHd<Ml!?u50GWBE#aDr@(yS(523{Huppw+s%&FC8<;a+Ozx#Mn`*_(%#-y zhV7!K(uWPBtQCcQ-ePYFw{BHhT~=N04Tm>|w}uH0QZZZozi zx>l~2wnOBRs1^f#V}`Qk#a?EVY`$D6l|xe(Au89L6`HxN9i*jeYv8h~H88(b!Q?PW z+DMg2oPvP(VZ&2Jv`;1tS^9G;}HfYg4o_s)0?3IUG^1BeJJ};BJM6kyMWe zo9PgmG;~aL-qhkAtlzhg3{BjNn&u)7yL~{AWn+ujISm%}!b0vMnHR=VIV5(u z^~$x0j>ZdEz<^a`iT?O)HQrPnnDWG9>gw6p+LIK;H8Jp$WNU7a};wWGCd z;fFryZ0GE)+o}m`C#+4jcXow{u!fB)5LO5XR8+1BSBE!+8^h7?8dzvx!L6KvLh_U- zs7}NZ5(7oLr#Q=p1yR(&hvj6|>(`AM-Md!zhIDT&kyUMj?%Swq^|}mJEXe9sP*&Z) z158*W0yb!iu660bow~fs*a>pGTMyijOJ6HW)?M~XYe8ApHF4^y#bg-q=-_TAcf0ox zQ{3d`9;y=_8FahBy72(J7M^q_`F5wG1aJ%}TS1sIplduaO~rc3|#dNUxRP zD>ckDZu{^B5ObHx3u6$qvyD6BwF{_xRiZwz+1wmSY%#Y)5}V9T+!0iMqf6!AOba4> zXm?f;bTjRc@#5pp3{~F6$#I&j$6ce12-nGQ0 z!OD}#<-cQA1$}y1s<0|unHt1`usBv}j(XmQNMHxw2PDZ+w>gzO%fAk?m$rs%T7`QQ zx+&l$`*U5FJoPT*gfFFKl4tw(+sAsILHH?EY%DoK3A0w~xn28f@+6;rm*+|oqXrH^YJ-Uh z92COJepHD@TMV~JN-K;g#@bsIM7GJ0+}S1ggGJ#o;txWN)IPy8xBzj8tS70ko>ZyJ zRa}gC14$CAL>`QKA$Nw^Nc9TIVaJd@Z6aoZFkTp*f!Q304zH1`*Vfc>cO7@vbGMGW z8@aoQyIaT@F^LXyaWl!c7i59SJs=2BMgaejWQSoTAEqDzBvh;cy*-S~6Qf8B5?34z zL_^z(Y0A-mpmQom3Br{cu9vc6!@^(>#D=Z1tl+Q!h5@W{MTa5LMkWLKJ}*f7JQ&d{ zhWHsqnrrwEJ2yIzs7S|=e1@;{5fj|>RlAmL!;N|3q z4)AMM#EA3q7`QGXS3{{lAug&fGkUjV$8A%AEQq|&lp>b-D~Sx@ESkHPr5{iK6XXtZ zs&0NqI%7VHF%N^{Ib%IWvp^)Gw6%2F;$?JM4sUTV?RT^@oeX>v2O9 z#=q>6C9Y2pB8?`woa+H;GZ%M&^e*Dw}?usp7mU{oq)GceStNS+Eg zTvfS-yVcxX%iUV;uH)_|<`0nhGS%2eycS=QP8cxwY0yLI33_}O;&IZ1B6be*?zB0CDNoQfV#E7jcPM!jJk?OHWCOpc#x1 zM}|B6oP+WaY?9AoC7319kN^bR4(C%k?9s*11goDPx4C=n+g47| zsdOQ!f^|~H9{T{|3}aDQKs?<0;z);vu*=Mmh0Kv}EGVS}hAk-{o*GSNxMc>1BaW*M zut0+J(J_t2cW!DrW6u~Uzlo}CL+=!$9MD2N1;MVYh~gkO z0X*gAn;yhPU+2e1Y*sR7d)thA$}ZbfJHiN`Z0tcs)ku-dWfAW*o|vCA*aWv_wI$a_ zTn@d+GK(5nnOq;uT3j6EcGA>R?N*A~I z=rh~9W2?>1ZS875RV24d#D`xlulh)UaB46uQ0?$DSx?!F%4UmhMmeJBW()TNU?&}g zNm|bFQShUL%5(<;q#;u}*O@ytb<@gggFDZ%k+YvOm3C0rStE1H72+6hu?(}lly}6^ zIBt`iu*Tmo2V}=oD!u50X!!#+R|>hjQ1u$KwdcK*9RoBy=8a~Qyin-bBP1nnUri<) zHx_1ejZWO0-vb4+sE_nscQx!Q+m@Q!3iOal-K6p1zU(sPX%h?T8Jl(#DBfPBz?5q& zx@iTSq{brnmm6^`ftN?peeireCY+76g) zGR)4_>Ba_K+pHT6y0KkXcj&%GU2W3+QC)7)wD?w;W8DYngL1SOviv+g?1*Xkidh-|`>$qT#w1rk`!WujT48gk6vEcEuZM1gt!bW^{%ciQD)^!#8C}>cs42~w(|ITC8 z)2eL_x4+5RK!z`|0EI51<@ zCLEJ79FsAG*AC#A>`;J=7_A!!o{?ahef>a)ilHoNxdws5(GZO5!AR>YT^K{MUuFsM z=i;R*Kc!=3XoZ9;aqK#`P@UmuattNJ7T39TQJvdRX9zE9`W;9COR=KP_0o2y&JaTE zQS3T5X6w9jAV?yPXBg_;RH)vOrRv>&Koa%V=->0Hua8i@;cS&5WVlT^hN>LpJyBs+ z)KPa+m)tj_KMA9;)Iktp%mojt*3Hzg%6O&3Kg5ZIHl${Mo}@sqBZt)Z8Wyh-AL|qv z4m0?g7NZ*MN0EK>eQV6M^-?+P&{*+-3jV>96|gESSqBHg;%Au4aO%`&57LK(eO%FL ztrBE0>t<>vz&|BV7F`Hyx9CERpN@L0UD+<&ExHY|rfA(6X6@l0o_FdQ`HUQ2$ME_0 zXTN-pC%zt%oF40@Y}Zzs)h3Q*#}$qer*W1VmgHKpt6U2yPMoEBUF1koC&SU?A>=W{ zJ94AB5goZnN#NzanT=0c!+HHUf<7{+p|>N&txh{{lx}s9BZ-!IZRB`Pwq?(?TlPH4 z_Y6D3L|XiY?n~qyu-Um{Rd(*cS=H z1|TUr*~@o_aj}BC{+>p&MHle9Mcrl#MscJ~!?BOo>k9`ZvLRy2N#H&(6&vy*+LN;q z+RN&Jmp~?ujHGhAO)%aKqlmpV_(D(s#i`29-!ZF9?3K$f`WPHlE`!An#`nE-^JmzV zxWeM99A|VQu!y5PixEkm+hw2Qb7$|9wpsf$ZkK`dQd6>)Yho0A+@m#|8@IN8eUL-?L{_lE*g zA=+lEtzM%wt1N~Tjr!f|Ge@4qQgGlcly?L_LmNqrCoetknJ>`YDd!vR6WbrpQE|6o zlHZJa+cRIf$T+?H4UP82i)`{)K%NXVO4G!-d=~Pa#56yB=9%v_+)|Qy7OI=MI5wPm zcIFFY{A?gk=5Q*R&O8fMPG*iwr8C|%m<%a&_OnoTuF#np@t(Accos(X*yOXAIiGaF zW=u_M{5bbnK=X^EsY&f59a}#OnP-rBR%HEJL}D>{+P2bR?Gfa1S&qYXtqHOeEO$*H ztb^uJc$)#Cv`0EM{`p9!v89Z^=F>G?Srh3jbpu>d1l~n!XO_1LRm_&Ih;Gl}Dl|4b zH9nuJF&w#SeEL&kZP7NBW-K+<8ST>eB%`)MR){(V^Mcyi7HQLyVkoPvo$VbSG5XXt zTz;e5}M~Z4GK$EZPb7xr6p<8yF$JET*b$T^$`N zp_SSm#dSP{18RFLhWpoBT0GpeaA~;G+lU4KI)2^*UIwg(!h|+#M&bAuoQoQr)$6Rm z7O~aZNC^|NKpK=Vp@9kY%U)gE#}zLR=vu$7-K1;Bb?t<%ozk^45c0u6Ft+^MY9q8q zR3Dubfh&R6VD>fSyy9Smj+BdvVP_PF$XLWy&#aNyT4aJNTySq1sm%deH?s!r26Bx} zGaKP=wAo4I?EyQjH(3wLjY)UYO%mEzbMZ~RtWhRfY?o{h`hajwlTcUSr4 z?i#MbL-&`GR;FG?TAAK*(#kX{NGsC^LF54QSN2Ll7O3i#LUJ&)rdKLrMYxWym=)t5 zz7kdfCC^fZBR5vgxEbd%uzBoT;>+=QZJXtRL~X7a=U-E#Yp&{H_YQlotobBoi&rXL zmlS(;GRhss?$Ul?skFf7GMLHbC!&Svva?0OId5U~ZtO1$i`rH>bK=4z_9n5gK@@l6 zu`rc8Uo8wMu%pP)Ybvy-S(t-@HY_{+Ue|Zac4+Q*Te3OMB-|Ej#}z2H(SEvu2rA<+ zaikm2L00^jDOAEmF;n0+BVZ*quK_t&6e{L!35_S1ID$YF4Jg8Hf$3akP#7%Fxq03z z47@rLQ7NALQv27%xV@>aFqY-Sy!~0&*JiUvw`C241Ra9JC7T+uv2rh-J>qNt>zwn{ zCZB8WC$-~R?P<>DS{VNgw}AF*=H*6kgosJDBIio`8{7zagECu%ERx|uV`mp{^JYdI zF=k(OW4gpuyVuH42uJgi+!D7+PMwz>Lf7^6v#rY;LfP6ng9f6%N=H}MGAeX1jClcS zS0hm9iA6kid!lVv7G!g?C#dCBcw#M4r6txP1AGh`4^gmMndka3A(nP04@ za(zH=<`8+W|!B8aA;+|rRQE;CYnYXRsklH#jd%JIyvvIWWPiw^;?TRee{%UJy)nHYxVss~Z|F3smgbSC?39 z@@ap+x>i#P!3vkq3>QD8SXoQBn*wauQeITNcZS8y|yT|HeF-CAPxbfh3< zbyiYsSl+aEM3l}LS+;6{)6z;BT&*3e>1c!XE--~+u{Qi{gY~Xhds{SIxWcPmw?XE=r8VZ|8e+27 z2mP>;@CHcGLK_+jH?NL63Bb|Oa5WmldW&@r?nUP6)nrQ+*F@ru$o0A|E<)a{%UfX` zT$dYlWv8w*>q<;l+H{56-BP-BWw);E(Ul%u*-KX=7h~skTvu+>oX_xd}fZc%SMm*RT>ec&ZaH(Z=AHuNstc=SC`VSuB?oHf1 z%-tj0J<8o%e0q_WTQ z_fb~A8Fx8sVC5QVHb^kDi_I%v+REHMx&qD+cEI2a;gokH_(0I}0#gW#Ah3fLFoHI5 zMiAIRAr|C(pb$7f#jFS%pb}PGOMIXbNavKX()GPkIV-E{l`2>{)}&!pPkME@#TqN< zthsd@ACm?<*DF#CX7f7fHF%&!kt=)jrmy=xwr=+ z)7xgbo*DG}*CPU7O_xbcSHYCRlA2=8#|_BsL@64#pia>`D4#N^gQ9gnx`RgxAX+y? z^N{^1iq<2d^-#1PYp;kFM6`VrO?RU8Q?y#C|0-L@`mLKpv=E{lrf6QL@+T=;y>!w# zO)=snsQej}yq?C1*M<_!MqZGmKM3@p0rmVYogbGBM zrU(I&DW|J7??$&iA7Sw@YyiA~f`Sx8S8u$SA?zMDiy(kQlw~czF9Y~0Ymr{YtXIGa z87f|hTwlp3ZIKh{H9S(g^crTpPDEORNU!ISz*yBhVdV4{D&TDt9Irv?Z|9-lv53(3 zQ0V)3=vsunpNEz@p&zBtzvQ8{2>lojEptLYNui(Sq3aO(86H~hRPIX%y~^69FEQ&Y z6lX5J9+mqlk5u7A`j#E(Tg>{lh*XD2-{FzMw1L~eO%j9>TM}E%tr4NI2(?8nWlz=? zgpA5#wpxw5yePC2TgW_fxSQ2G-DHJ!VvCYZJbPQQg=OXK#g;HBZxfe=NuABuLin|I zV~+Ye-zcqWk4ntQjHVAv)5v_F1xz8u1~T2>SAGCv&)ON$|bt|+I0RJjG4|D zE_#a*W5!eE6BiEADGi9bK?>in6|aW4O)ru-#l5Gv>jT_QV#yE{CT_=!mwqcna&c)% zStYqu{Cy3`Gw2d72UZ}!X){%IA`)PTfJiJdbHZhappgt}LCV)*;-`=alxmDQt{Ug% zs&P=InS(e{gSCz(CgRH4MnnP$gA|szJXwUU%HWPrFV@|0d#`;gA*72*fyuqAr@4Rc zrA%ty)Ckn#E0_{6YaDa*M)GT&@FM4sI{$pQHE%DFt4Q>3k{O|WMP~;z_{3XT!k_< z38QMs2{K}xt^$vc&Ic9+!1}oh_3-gEU6cbNH8Ztu^87@Orfbu53Mz2CfIv>3>1&(R zBb(Zk;|et2{jOGg-L|5JI;a-a*=kLxk^XCUgKG;N32hxaq{}w-AXgZh7P@fmu)T%U z>8Gog>Z|&QZ~qu?cXIkt?&MdQle5DNq;40gM%ml1JiTcGtNS1bsho~QeDor$5qX3c zAc!Lq?00?~PTlPWoWUj2JRJ$#j13zUhl}?F-8YKj**BGfQG0`%?4hq7bl)iZko!xB z2JKG`oj)s|?sUve@Za&V@sz>e4#RLoXnzWtNhHj1cxpH~UXlN^ALa?p!kYd5)OaeB za#~QfKV>FidGOXFhh2rmKpc0XIT1>8e~?b~a3*vhm7%+^VYZMA5e4z{!1&Y0BNGJO=ceYbe~%|3p`sdBQVRqr?B zuw)9HG!MWi0=_>KJtvP%ix|N?XlcKBIF(N4M(|}pRsH7CsZ4=PiWdf;EW})x70Swi z`uQ(Wi%`EQ`bPXLaegAYfOz`NQ!uv_>YvQ}MEO7MPlPc$=JuJVUtr{+^AqRPo5se+ z1Ba)k?mT_&B(zM2N7qd*J9@lFQy00oIlb(oYoqxK-7f71#4)<>6R1tsju-%ouj4&_ zK0QiPmycfdPo2m0xgO!^1VLqWyTU>G?V^v7eIxkEQ7F~&JgA2z&+>dvBc+!dLP<#O z30w){C5uUZ{Bkfy$2&(A@<~+Am~bvn#pC=gSWjlVHdpE8=JQbm}bKeKPI#KB|&`!y}*BAYwSJ-8G3h zUY<;sIEnb}iv+ZF0rMA_PDx^A+?@Z@UcDNFWU%BIt`0%N#wMqxVd5$c3TK;Ih_)}k zeiV&B(&Qa((vpib+dC%Bj!#XE2RKAvYdYxs;Jqq>Y#maOQp6MeyKM!y!Sl;qChHt> zy3=k$ERuI+C(O2B)nzNOvavEAIk&c;MjR$aAb&j>YjHBOU-q}R=Gv9qh%0N4+O{j|?8|J<@m5INH~@fA9pX0EYNm?}-DakMtcq zbuvH^j~zeNf9z=QVRo)#wcTrvFW&^8xu^%!X|%d^75TUTI6%k0UFAsBbgm*X$2L?# zjBAGkaOxBvOO0cdXikMjlTbFdO%WbV_|G)k2d? z!>vB!BivLyJ7k7g6{j$F}VR7nG z$_arRNH6Y}7QLK%c@0(M)O2zTgp5!Mzw9qzaOh2#Z#+l(P8~e9pEe63jED5PZKN#h z4g*oqhm(^hFe`fw^qo4@cfxQ}c@c06O|G7kA|&nPM{#&3r`3~(kDV&Ue1SD=wpJwq zKr587ljB;v9|&)ZrT1T&Oiqjqqj9~5`}VH}_0an4_YaD;9!X6MftL9)?x$I0j@jPx zjirx4k_y+Xr9$~%&U*|7J5TiQ?_1>}rXUu0xg8bEP=fvtu}H6aauhiW>M5AC&}HOz zyc0>`GkMDj2DO6)^xd%5E690TK+T*a&iZgAYZ51oy-pR%R;x)UCf*7sADS54MNz@~ zr&Bo6kk`Yps+KnIX#&cmQ+$Bb>QuDEx)=93hk~7 z4H4G&UPz9OC$V!`$!f&(}1j9Pd#_hD>l%THj&hyGk%CfGW2jNoL0T9rkI5*ta5yVsq`6O*_+4sz^c zBXykWP+jZp#H1N?@tCI2(9NfN5BJCWZK76{|8ubS)TtBwdrzP0Gme}-dZ{8CnT;1dar)?~{v&;Z`Nh-~24~aNED?bU+q_IzHV6Gc-%*%A-iNyx z#J;tOm(m91oPvnVGwZ~8*qTvC0+zjvSeYc-j=iTwCTsk^zoo^*~K zrm$1G8xfdE0Bds3Y5l4}=_1`^+N^mA6mSmx5csRymYosf%@3SxnTC{8%02z+9>Ey0J7OCP(Og$s1NNpDq4c#HXfv zFIKWAT1d3CmS{^f0vF;lT1%uW+P3giK zOJ6s0Nb__?)%HkRCnSs7qDosdikB`F)*e;5THBBw7HLov?)pTDwqU3>N`v$gMLb4r|nCN3;b3L|t9b^rPZa?0bJ_0#rtOF z{i&=PWO5l+Wc;|GfvK;Nxv@W}Xh0nd)&@#+PZ=4tfjJwcx(0`gYxN+k*>J(3&}LnM z32I0jH5l8Ou>)7!F=Hn)nwZhdU_jc4GNXkVF=n(fqm3Eu%;;c7Co{U3(T%Kj8M~Qr z12gt8<3?umKr)8GIE}H78T*;h$BZ~L4lv^&Gy0ivh#5CA<1jOhFykmQjxpmnGj3+a z31*yR#wli;X2uz2+`^1onQ#S!E-O3m*Tk(&;58_hUeu>54{5ZDp?T0E~qoHyWkBd)}F6a2T}c`Kf`;dwirci?#hdA$qOco=csjpsc`_kO@X zg!d2Q`3Rnm;&~LXzeLzy;rS%Psjn`78qa4?^yg6Ym+<}#rW@Zxw6DPbYyAEe9<=Un z;C&me@2{tf&Z_F_rKu(Z~VRr-@@}dJpYF0_jvvfo`1*lA9(&Ro|c7|&%q_uzR6o_q1UT-KFWz<(v4SIc_Q1G4TR?0y*j8{xkN&s(90^maV& z!uz}Nya&&F@w^Yu`|*4P&qwh*io6>1qQAuJq%LQ4d0dy9bh(>E=EyYD#}WRxta~4V z{~6hMEu_3Y16@Ytv$FAC@;?Xo=ka_&Hohn`<4btnk2vp=5%yJN`ZYXX$MX$5-^BCR zc)o?_Z}5B@&v)>A7ti-l_a7jidA$EfHUdm9{)ue-3T8V!{{+xg`2P<7Ws0u6MloKa z$VQ2>jf4PTdsjct3|T#l`|Rb==NYo2>_b<0G4E$L zKfz{xNPr)UazlUS{>a6b$}`_)^2o*avzO7^eKLx?`Bn1F7b)_CGF5WqA@*8%<{_Dl zjJ!_xSJ>;tOZ^*!fALMizxmDF4_51|(zB{A|#HY;Cte!Nt^lKpYv zNqSdCWc5Mz_wvlgk>tm+JR&PU6F;aUVX({VGa!Zm7lyy!{u~_-?-#=RrSSeic)u3j z{}kSDg!hla`>pW)S$O{-%-wE&Eg!g;l{U71|hw%Qd@ctmY|0ldZ z3hzIK_b1`~m+<~9yr+aWqwuD@Sa_F(caQL1BD{Nr_fp~AC%pTG_j2LALU^wf-m8T7 zYT-Q~ya$E%knmnByw~AQNQD%G$OJT3F@i;Ch^0IrE4ZTP<+8S8io>;0?qRy^mBLJ) zc;EWEGe3tAvGL)FS~GSmg_Qr1vwQk5&Bz0E)uajPX*c@9L4J zC0293SE^@ge~vU&toBYGv~HYx>t76D5vw!#uMNMzuQhDr3_Ks(bdCe-U(hSnvCWSG zww7)AFuXFh_0_0`hi!WRzi|7&J@87|_Om?xj&zR{l33$BfLqwkN8xQ`O%pt0{L%z$YS`eBg=)*AKWo;XH4^(F%W8A=lIe^4 z<$IsBW;}^NPj?nSYViL`q?)_oq_*idw+NSZ0a6$>x( zkbx_+q``Ux!Rfs;gKHgL<)H$$Ke5(&fXCSWEJMTuST>jfCsF64n97GRhP%LBhbfN_aZUfypMU|g$| z7yC^DTx-_mf!{2^>&$fo=5>CH0IfIIyUlp30M&6*W!d_^O@KF;8{C+07od&iM!M}G zQE%3BpZY^Z!`~r-AzMj7ytqdM2p2@SnY>egAdBgO-X%cW%xx~{-2&8L@|&r6Uhfg0 z?dEnj`}Yda4ilGj*bRK205zJpuEPesUx0Ags|)&o05zFSZiychpk}k#jrAb`ikJ~M z)`tZsYDV2y9}%DyvxRztSM{R;6fD=N`13IVZa3Q# z9cBm5@8bg0X?D7x#{{U$>~cYm3sAS&?SeibK)cLcF6gfWXt%lB1$|P0ZZL0fL7x(! zJ?0)4^l1UQ5jWvF_4_=(7UUi`#IWSf3N1z2;sQ^mzfob+|6*3j(y?-0y#lcR^nkpabRsw`ad1KnKl(F6gTQ)Nl5?*?&!d4w;ACyuL0#xO6vh z*gTAn@eKjMRlIJTZwk;+^Qax?uLanNf&dzBS5FjQ;E~&X`b-A0(8baleopag@e8)K)0H=CT=rtA_J4+ zb<%1Xm=dp3R&3y$cs*ye4cwKOJ~SutOJE{5<4TyAm&O!0{L0cQ+`Rhc1(NKH9RI2-(9-+D(LPueE33gMJnwUBuLdu8QgjOUM8ikviC9E+I`keV7`or`1lY{&Rxa@N3hdk(DgZf2;MJ#LHR2G)B*F($)(oGEZWz|>3DMcz%~OI#XK)59A7Qq~KujLZ#brmq*@ z{L+y2WdsaqyhneD9{mgSXn+baQ3&on=Y`g}_B2a8bxT4B93+#oU8yuBe=9 zd}>^aZWm;}hEZ7v%q{HiP}qH>Y!Rfv5<_W1Lj@T7GRDi}nkvZswM^gzE>E8`UuR?A zt0-wmMn!K&(g&dR0gQc;W9$PWIeG76V203j>eN2b6|aTr&aeu^)rw*B#u$S2*-e=z zq2n@t#fi|OsU^P#+G<|adIObHq!g*zjD~{Vgo5g3ZhjK?gAJ=&hcy&B>_LV)y?Dtn z@XN;s{hLsMFEI8Ncwc1lI~Wva>ahQO0=hGEi3xMUt%HiHZrR}d_(*YF!_{DYh|LYDZY@57TD{0mo$)BDh899m zhsR70>(*l&{`WY{6^W*?-W zZ#r$FZwkd9H~c*!{ClWOy%eIr?`H$wD*|WH4TeCmc@ZxzNmtoCGoE194-x1Q)p-Je z>0w_ns$f_@p~+Ohe~QJUu$F+omn zlYRp%0H*zxS-(YjPtM_!(8Np?<@e4J()}|&&D$9#Rqul`A$sCp*_MMyK$G+n_9SgF zGF}0@u&PEnW4}i!9F>31tbflo_&=yBrE0ONebk3of8cew_ymm$!WJ4AG(J3aGZ$%K z48!Ku2iUMtH}gR@jE))h^F056N`ITNKf%NB_%pNqh#r|Tr(A@bkr6jQpv%L-;=KwQ z6C4U`nz@KZf1N3>manp(GW9`tf5)^p!TWpWc`Ll1G5sU(e$KpKfcFb#{7|+o%Nz-F zF#9F)y!jzk_hGu~4i?cH=ohfBG4SCFrDRh2KH2%eG;Lb15E&p&P9Cq86CVcg{V)T5 zs@8)t3|W7KnfUuC`#`<);fHD5y++0$6WH-O83+t@O6y@{_9(u`U$Xe44zj;Vo{xWw zNz`xFn~}!j_QPALA3{T(%fm&*FlA;86%B>Z3mA%Tr%Da!=Et)G_N{VDQK;l^@jZ*Y zA?sa;@E8huoW&n=3VJVKpJ4M_&Y6&~f4e3xCxFSx~i zMil!Uw^%|O>r3*GVSbjCqBho7sS@~^t;N^eT6~Ubfw0fB{F;0{Ta$0_nus`Vhx`rY z{{@l%cNgXVJvaX^+WCKJLH^&*=KljHf5dU~{{nCA4!gBKbX)sn(c0&_t)<~%J;`g} z%W2_{-5Pwwri6c+E%7II^!(}dr`ZTUsP!%^X6A`+Vg99e#=%u5nyO~*l+zKu+=Xx>7PX7MDQXE`WLEeE(Tq7 zTUH2zewS^;zwv71V9-D1VbCvlt9sBzYSkYRId>lUQ(i02=CsoKGtYP4{8~=)ofT@Deh66X~KF50>6Rj;2X|J`xCF$19r7us$kYEqs7jfX|Z}g zt^ubBP`Y2C>5RQxv0koV`h3EAr80+^0n47mH<^jQkFs)T23fCG=H1!lgNXJJqWv{1 zrJ&ckLEi#Nd%}7cL4PBH-slE>n+LrGLEm8y^JH&x!@kSI9#Q5o`+>i!{e<;JwEcUcTfU5@f1jE7`vLnP zg1*L^9wx%K3weB#=YhS$Hx=t!_^jv5bMAEfZH0D)^-^+{S>Hhze#GZ!1NB|{z?BNJ zScfdW&$GbU!1onvR!PkB4ai)4o*PN8a$;R^VqH`5|(B%QPE$azp&N&H9QdH z-;3}22YA0=>iw$qYn~+r7S9q`_8TRE)lnSBFb&o}Dv1}&2|CnZ{Z;{WBOE5`)?i&# zK!fJ&G1g#N;-{EV8m!-mpMpX)SidI>@yua*kuDGGVsEJrd1x_g{X0eFlK{nQ(LE*D zv3PZ_$NGbv>N6tM?Sxc36-TN+Dp*FpgfP!H5 zZm=$^0`(~DC8`J$GkXJyqzXK2SKxkCRQt=K0yS<0FsEzQ%T@Fg_FQjgqPOl>DeX_~ zw69WW*sWEtwEG|py9ZVJKzwb7uks)UAJ%qnP_5UfXa?T_VZqp7y;l5m8udDrzJO@c z>#4jsEagRUZ$RbTMd4Pe8eK+Ai^4ZiL|PY$h;ODWoh505^#+yJhCe_xRj*>bO(i78 zCdEOiS{g0gsPH4GFrOhFQLT5WbLNl47<&(|(G&KH38nz}Z@zqLus)z-u&h(DhI}t= zbw9-0j6F-;%=9o;k0IJsWrp>-8HJXQGHt6ew0O)6`w12x9F;zVzQH*jdD!WF1k;B~ zLv=p>BxC6(tw+@>^-q=GsA4f+p?n6B-XW`>gZGH6eIDLBWzQc~>tlA3AM+%Ssfo0i zCVb7(?@w^py!p2_Rro9W_fPEKpR|Af)c*Y``}g13zdwUU(QfQ>D(5Xx1Fg@iiOi73 znLt?YeUY#yIB)(vmhGY9W?Jd;eF9QpmnZ9ARjn_pm?aU-VUm1RO?XTjg3T9t$@;oF z-yrB%S#Z>sn;&HvKA){+PD0{z6#W3T$ zs`YI<>^|yp>$@lry_L)C(v&q6 zN?R5`N}(-n;@@}fTW2&HId<~@Lwt4TzPqpIo_o%BJ}P>jM#PVazHiFf)AFci6sA2e z9@;mtOmO32kMN54gFBhv(f$D?roYEV{pq){?AzFVDQv|$k?<`!*nM*2IrtkY?qc@A{Jb3e41ND+`u<6lK7{Xw93;Sx#`vOkxDuwUfSF6bYOF8Lv2*bn7k3w`)!`o_w&^D=**`e!y;UJt~?^+IqS!~2XL`Xe)x1^)t}&*`B*HbceW zqX_+u9@=bVAO#;p;P>^w3L{Vsz6yaq)C2#;Os@pT5&C02G-O0|1rH+dU-iJBm{HYW zFG7E+hyJS>>JF|$=r8ope=|cpK|mdD3{h*mK}Zp-_qxj)UU>1M_v0g)k>kSG~7>%-5 zQQqppZuMrR>D;%P&OOs~?%5_>wDAuCV=nwtgAX&TskbxXZ8%gvC9>bcpHGY8AK=et zMCnod`7=@e6a4wCs64KCw6`hgpRw%ESo-HI`*U{Rxo>H2H$p%FYVT0^N%{+Zl4|c% z_yKT%a}172yFJ?PnW;6F)sPxHx+C@bDE?wrkFUL7NuOTK{*t)XJnbKtY5#*|{{v~C z)gH0arca+YqKYWyQ8VhVSoT+lip}i9j=21AHEKoC|JeR^jN$j6n92W>W&e|sE863B z6r9CM_Sdwy@b@l4r2mIy@!xN;R~pOf z1 z@Lq)fp&6bNjrzEPClUT3GyEPiTn%22@INxc&za%w;5LLmW`@7c4EF@rBm84#`0LGZ zue}z1d@cIi?uM_vc+q$Kg^T#_!~DPJU$}_>{4dgf{rtacU%ZG&f)J6xe|iV6F*H9zK-NfiSmyW?KxB)EUI8Ls;qrmStP!%H+#RBdZWl_6V|>1 zHu!Et8z9s|?nf5%bqwnx_r2R-qD|;0or(iAr81Dy*Bj8Em z@A>hhFakEDf+vO)NUCP`L9~2>2+L--puRsf>-$r^zVru_+s_s4=LGPjlWi9iBHL)L z{?ab|SB}DeLvi)YLFN4q-<&s!5IpJR*iOOpLtOrdWUD706jAi^uJqd+!LUe1 z{QU2c;K@@}Q}Xgy9hO)*3D_G7zm^CPbaQ&IBR~fq^WM4$q6!p7)Duke37|x%>(j1t!TW-Gr>^>h6(Z zoe8P4BQ8R;x}!TP#R1UN6$1)mtQ(@;QK`EFa_POXVyGqgN*)HhiP)J?Af7FSBOG%Z zcGg8zlvN;a16j#wUR1Zu0lX)`I7&^Bz4kPbuoV6i!0g6fe}x#Ts;uU2n7cLHt>tbV zck8*^z};2cUCrG!+->CUI*3_%AZZ6MJ9o-W;^2aq68(^MW3H6T51BC$2HE|x#3Uu9 z`03eSPRV{3wtfhLL0%jN;8T*{Eiu)Xf^l~VhDcK$zgJ=&Z_4ZUNz98J%64GA`Xqo& zN%Cvx@+k@m47sZlcubI)Ye;M^n*i@$5!E57xqJdV4432{lAD7QxWE9`a!6^en84oS zR=h*5=FkMF4Ufw=q&9md)CPn~VWFJ{U`?Ae2m6aGk4JLb%oe ze){yqR}gcV^iW1eLedMP42mPz$n@Dz-@3G1q34UHB12;tbib4;o#aZ-l-hxcVJLiF za`D_?B<0~ZlyRXinVmLt_%1CMLf?nhI8^_R@=l`MQZKzB_MEY^F|=nctsc6@I#)-c zD(IS^mz@Ljj5(suOPVE6Rz^3DLHnL+U}}^bnxvQ33QP$~Z=A)2X&e*Xn1cl|U?_?7 z_IWRqJSZ-AIU2_Vighk?^JwUd#l!l%EF4a$qpKrWI8~&MD5>Vez4r2=lSMT;LF(%4 zG;j{cT9c&~FU7lK9&1HQP-9Y%;_kCjtfvQ1-sTucFlgnmCZf;LcOr~daWu8sa2#lA zRVwT*;FMv23FcsetWsqF2nIB8Bb_o*vnp*+rA>qjECCm|O_idm+yP~t0N?uP1QM|e zN^XeldI9SSDpSHI8Ap;76tHK9autG#7gJXlhZOLEajy95#fH_Z)^In%-L>3Z$KCbZ z-N@Y*?r!1kR_?ZQH^$vgm^@Mhzt24g(@8LB4ftH<9fWMO=-v+WT*)_x(?tfvu8%2Y zg91*Kz#y#1sO5v$@=5vuCsM^Aq^(hLR>ng7L;@$nu$)u|depF-q@*j!a#G0H_rDG4 z2*OK54;#DnkrOAOGHQ>!x%uB%Z;e9Vk~r62`MFS-CuXBQA*>nWw4CcDI0Zvbb{Mm0 z)-}v$kB9#7{ZKU^ZhXUb)C$1u=zioFtp$c zvnRMv$MH6O7qoF(N>tBYZnRJFbE~;TblyD_({VU1sX}4*P<%r8Xg`{b=df$mv<=*Uphxc?oy89vT$x1XC|TW z15O_*tvCsLmpMJjIAfO_>*$19Z6fM8{GeqU>ykR+38@3f{#~6h$5BcexWM<1B|4X%iU|ayN|p3xqE=S2f2G4cMoy*2zRgN?hS0c>T$CM zR<(+bWTAEt2R4%j1dqVP)pVXqYv?4GYq#TkRvPIfcew@x6)67!9?MfWCMa%U=`~~cPi982-2XEAO7p<@UMdI z6t1IqUB~r~k!0%4U@&oLV_9gxWt72jiEv;!0as7CL0d&)?yHCJ?&kf-{LWYJY-@8$opJ1!6 zM`>e-l%Ysm>h*ZKrnP-<4Klo)N3N&;kmVib9;04e{ zKT#7CBPRi%IXl;UDOGiwwJ3QAT~XKCy-{Kq&3ha`ABw}_2l5*Z{vTbWRJS`^P8=}; zrj}vIlH;-mJwZ|CQ;04|*sIAedPQHEKfqnWtyY)_=2sG14t)j}jkciT_AJ4wr~8L& zOwW#$r>8k9D}-BKsac60TgH4C?@lgvHB=h8HY!`Zf5!nP|{{< zjrGrw`slOyq4=dw0YK{r@T)*W&t=dZGs^H8U@a@SmCVi=!Gz!_+;HjlW8M^_MK7 z&n72Nz!GYvk6= zEt_w>x*3r(V=G@-3}%3rio-xOcf_0k;7%x}!aCZxX$750V2G4mb6lDpy*>Zp8A3<| zw?0BY!j*FhfSrooZOFb73GE)&=K^ru<}7$GJ^<7cPE=e+z4lPC=2Ulr$~)pv6tjPq z$%aRvX+!by5z2}^A~~_EfYUa1$H?)_fg@Y>TYRy#Y5~vM3(kogRajYb+EQ&w)tDA5 z#gW?D+Ah6xTGu+Vu?-GgK1NvA_E1#Jq0^|}Ia(Jz+4?x(vko2VGkI0O&a{A=)nN`7 z3Vs&HdxPa;6M5Q(jR!t61zH)Cr#J*$9wIXkm|erXh8zqxAM3ILaHH2IckQ&XM?Dq_ zX)$Ed0N*#QDzHA6jyvlg#$Uiz17Uu8#=!>*>bRE2PRxS3ngpts>$>X)_wCsp8eRhE zi69OG>cIGHEHNo)*0q)RUN9y!(q7IJhaogwl8sew1Z_&z2fwM>Hz)ni5qj{s}X5k6l!2@kqRBbI#q23QLxVT>KLXqpYlb zqtpnZ0ILUPbw2vl#dGDgEB=XEXYwg$!@~xUB_*)8=~Ab4(FD}?keQbais=MyEgbJ9 z2%40KYm%d$mg)oxsFmVd^|#98*v-a^bJ2xmrO$6N<+i7IkCpCBgZRs@02gU-V2~FF zmEHMrlsAi4AOc8cCkO@=S8kA@fQ$wV_t@m=aU#O;tK9fyGVyT^Q5t#`Cm{K9G#=Cr zJrm*RZH~IKCnmwlE;S5!Dco~2XLSoAr;NuYFMxB$^+NIO~FAJnIAGlNnmoEb-N7RR{0 zgl6gSN=zKy3X0`7$AW6aafDy`VLdW#8KQB((HqhOMf<*Z&5(~iavo01QH`8d2MYIw zWi#PDTxwTYLOapAE}5W^vZ4f~ju!_tM^P{9c-d}Kgf1N_yVO!UF^f0^O-<#g`f8uW zaF{FjQb=@rIR*C1;c&Ncf_#m2!}2s;!Qf4FC8W++r^6P3 z3|Ls8%0f!fgx!Y;>dv^n!_kb8VaK}5Y1Tkabj3S;j+HDYqS5YU-*@Gnj(A*7^mOBq zE!y3?6zQ4}Zt*DB6UQT5EaBzU5~t9BVjF|a>^KA|0d*^PbVj><_-a!7u%?ZAT2v^R z&yGqk)17ZKLGDZ>daVazvb)_a^>lVq`}Dn5?&|G{2avC05y_Cw?9Dd>0dw4B&pV1& z!CpKQ#?c8ytU<^S@$8fmy*<^)a4BUCJKvr7+y$}EPT=#RWpZb%Cn5JlJJ7yFqDM-^ zdfez*UNt!pk9XA~qv9k1ni?;|S9`t#xi}G*(bL^Bq)+2A2DQs$ZIv>Bfn#!4Gy!bl z-b62YyQ^oZu?IQP5%1RL2R|C*?yfG(56BEjz1^MEPYzlZW75-8RiuWqa%Wdh*HYsW za-uWdC3S(9W3nS~b;6+ZM*Tcz1D_q>$(=n?cMPwvJzX%9p6HZ%dZR%^q0PafZGoqp z=$1Nqqvd#RmBZy>Z+KOW?B1-jhPT$TdRD*1oe1|!en!f|c=_ar#Ue0ufodp9WE_%# zq3WhrSt&@s#bTujF()~!vKm#cRpmNWu2+=?RbH*iYgDmOl_RRFNp-=H>RQzWtmBQU z+M>!^fO0IyAnT;covNox^>nLch!|A^eQMw;Ro{i~TdUvbdJ*s!F%C1$}J~gmk zWe3#2K~*kO1J|kYA(b6gZm?;G*R|b%;3*fyjfc44%>XiY|EB_Dv0hrhI zBK`uDSKgt@_lm0Pe*6P2uInB6_b&W zo+Rf})W~h0Mk9q?f5rsq$ljV7!2Euel^tTc8i4YfVY@tk$8w)TWUsLQ@0s`|_7(PJ zpd?t{uiM^l*xsjY?>BAlg6&JwHx9$C{?fqZd z`-1JgXnXGwtzkK5dtYaJUvGQgV0-Vgy>GO=57^!}+1@wX-nZD^x7ywZZSO<2_wBa# zowoPgw)Z`@_xEh?du{LgZSU{f-VfN`hi&g8w)YQh?}u#fqqg@Ww)ZjH`%&BbG28pN z?fp~R`-JWNgzf#L?S0bre%kha26*8O9xpb#&H#{7ZAqbzb>Ey6 zT3BLaP-tR3IlvyrSno|qU?BI64FcA=|61PGtL|ZgLI>M+4iVbe)x#wFdrkX*5Ea+} z;V9R!Tg9UHtC5j)xTJ$iF@ya7MU+0Og$v6`he@v7|F%>V4(F$kdPJ*@*mv%vP= zj~ET?TEXu>B*UaS8(iS5-&GJ9lH_h(TjpERkd7BO0*x7kJu3}KX*nee zBT$tAjcaJTq+ZB=l{{ zgoltaz#fvcx8nnV48@!Z5gkZ8w~(An)}2#xDo~c+iLaBaHB<%RX`s~*$(y5Fko!laGyy%cy_F1TrLy+8l&->W zDOJUGv$wKu0CBA%BvlJinGnVj5NZWc_4@&aA;|~OJx`!}E&zt@33SDJ_DQ%K#7{}u zCnb_9YTY!*a&^yWpOO|AQuQp?@T~S3>3pQJ4AldUO*6}`x;F@k5ACzk!o84Y0w%WX z`4IK`U-Dij?b>$smuTU_NsL@n_)AIq9JQB4s(eWHl$2iG8sEDbvP@qi%w%3lR?U-*Y$SLY zL_~T>t?A|en$rIlgc-65g575Mzop>+L-{Y{Wt23__jm!w@<9<5fP~!zwq0nsz;-Y= zJH-}lGbHz*@h&BRL%Rv!vzq`y+k(F>0HNKCzng(Ty9Ix@0DiW0VWJh#vs)K)ZCDEs z&}do6wM}dV1Z{gds>RblkJdWU@r7&$P-Ww6Z&aLU2NG@P`H4;~kp^^iwgZ^Z0D#UW zs%W0{aDUHS5X%biv-F{NjsWQThx*d%kxe$%decHSmg)x}-QM-$M4z^8=&JO#d4xsM zz;Mo9vvFe@*d51&z1!RqR{@rG0AE|ZtzP}>2FKR{?V6$FvR{+h0Ja9NF7@ZrbooGl zTBDzRW}q$~2)Jhi(kfA^(WQ_NyudQTKJCEJ;KIb9b`aT=Q3{$ckQ3C7qyhb$jUi2d zf`bS?hTt11IJHwicsYevAp91Dr+IX=93O&a$+zLdD0LtLE6l(Q0*|MG{*Azp8F)Ja zC({7?Mqs5`$7#Ke)7qUw?F$$Z0-LQeQ_La7nKXc>k)qm6aaK=pR(thOYGER!y#^`5 zlp=s?{ti;)SQ;qQNK!*d>Ja)m4zZXK0Ht~_8``}vv0HlsiQ&{zGU|-`5kUjmETF29 zuFg#N79-tT7{E`5_AE^7(H^37^=7)aQ@VGuH1NNXuE9+A9wXg*7_dx-`W7%b-bd+H zk!)oZ%KLpv_b@vqqyfO5>Zg^sT1S}j0b^8e;0GC?MQPqIAOhz8qm;uMv*eFZ4v(=k zV6&09(aiW`6#O`43@mLu;|P7*h(e#BZvbLJk_ccEH=hY%zi!czr-bl*hPLoDu)V3)>oL-55>dW{g7kCq9dxmA9-I#{;Y-L2NIhR-+E=KL z0CkT(LaMK_f#%fp7zXjMAnx+{4hanI1{s@E2A{vlYhNaO6Uh%Ta$z!s{=A1t3rt&J z>0^`^6y}df1Q>o_?gs1>z&VxAaK(S%QbF0~Kab>x03X3yPJjM@N&n2Wf2NirFTLdev%fF54J`*;j?r>J+@R(En&0x9 zrQ9~7<=fEm&34Owft=BD`h%ALf?9rI*_LlHTmDn4<$uV;pBA?Kr^pN~|0&acPA!Mw z0=?zGU;~?%w!D>EK8|vASk^M(S4e({k&7{>KaVo$*M!uHmLo5{<-mKtFLw)C{u`_1 z|IJ(e+x(W_D&=koLf$lzy9Ev3YBxLw!VV3mKWKQ44#a!J+z2Pq~?INQ=GN!xT137VE>(U-*r;Uh6f_p_;)MWxNMeY;RH!q}aX1OCKp?T9n z>L&dssLPi0tqYOVtzzy7S``(Mehtz;z|((>2@iM%FO_ac_|elb0e9Y94o&ESVA z_z^J;0|^N3GJ`)v!5ZqYtvgu^mHUihbtaA5xPaFo~sUYc?b&GFA7$4Kr70g-){ z37;h*AJ9dZcOtoe&S0KO`wIftQ~;^%A_OP{&JjtpzXAc0jV)3YLIBZi(LN`hr`?^) z?Bi3%d4TN_{0Jaku@?VABv{AK0W^hR9lt0>P?KI7@_net-y3cJdr|wcI1gI{AnbX@ zZe+Ybzn(l3BFg!zB4CYy+8W^?$KRx1i)dlh0veaPjn1<^+WLP*t$T)N3U<>oXben5 z-6LuLsP{(J$CLk)xN*1kT_ecLgT7BW{!pA>;J^9s?`?UTJ=jmw%sxFAqqI*&Fdqd!4ixsUocWw@5@4_mc+0DnJwXv_SfeEDe(~ zQF2Iy!Gl0L>7J^(3WEY3oKw`-G!ofvaOAltmnkUTA8|aWnlbzGVy0gfd0aE^erMiz zFEhjfNqme~%waCvuPf8(c8f`Qh5!|>!)I} znEBG0#igCOSgYBj$rT6~%>;9ioN#W^*k` zN-hK7eA-?iYfI1ADVOOKhgvqhAxm;LPxM0EyeVcp8Urt&t1NHqptsoJe4Lefx_j(5Kq--k=Dp>{ z@EoWj1L_&6H<9o=XPFf5>I`sAMo+CT90&)M>Y9K%%%9eL^)(W(Srq+Mt&HK74A=mY zTa~?J2vjKtUWsV@B$ZI$Z5LmFPj)~a%|>e`^n0BAs$zc2*a&h;5PRIy7H z6ROhd>BZw*4Yqj^Pc(S7DvQW6(vsUqvDMAu zmaVOA+>LTK&fQM#c5}CfyM3(I1>PuBG6#^336)7O%UD$sOboF)3AH*Yyqy#ZYm$P( zu>0bntd^K+E@%bf=mjSM+a|+FJhdef{P+lqlm2(VWY4W z42;kMzze8_Dmq1O;viezbX^)&%A%w<$Q>LYt0!uaP(MLFi3=Q^AeLH9o?grT>9ISe zCms54GmTcnJcS=S;_xe=iDc!D#UqnEurf@po5JZ`xwxv3>j*4pZ$Ii8rYcjk7V_}s z6t8=`RgS4ou~Gu613MlhHT4E6f|49zP!d|A2nT%v@ttWtr}_;|v)x4q{Q9aKv z+DqnoF0&iW)Vv#yQC4U3>UVh^XywXl2!)x<7(^m3FE2ASuOXCekk!jjLn~L*@bcUD)VpbqLVG+mI><;@2@E!8An(WmX`1ke>|((yHH0W@&1hKQc36?VYelaU&w!fKaS09JksYnL@`BM6uf3Ci;5K1i+!G^H zu_z4`x>;)sHQ$M;-*PGk?Cf-#TO0%)JEM?0>q@vO8SPmR-HSuet+ylU(uWa3Xe5;f zp-jk`b;Tf`*V`p`#$z2aq!FWDyMyJfSWnDQS6nqbe0+L%ZhDxsvxdhrkdr+@Q)qZ1 zGkFT)gHa$r#^YWP)oNID$HIN?tKG@)P67yVGjTJ?q(R9SWHia70VV_xj^(NpQh~Jv zbP$N8ftqF@wO6YQh+FGawn0TIU~S1!RRj^;smfg-qE)$Hb!}5!*Qn}%D#@xl<=F*w z^Fv&!>?T#dRh5TTc~q4%sx+xeQ=Sey<#AeA@!k*dDQKL7$*uz9!mU>1f`YdSK5rO4 ze=U6ediVmX;0vsQPi%xwjKC+Xg-=*dzK!H-$pu+;IG)=gRCnX|njN_W6|-u$xaZov z`?$NGy9c;?kh|A$_b_*laQ7&8ujlR!+`W;zH*@zE?xwjr#NFGtJHp*D?v8Ue%iZJL zo#5^X?%vMbJGgstn(B6n`|o7cn>-%Y$m(4K0`Npgb`19h<{J?FxB!%K3(6AEML_+^ z6$3& zD{m$Yli+$1t*BVPoq$I+kjO^mhV6J6tEwZ>g6g{Mc=QV6x>5ldH?rtlyOD$=@EDFe zL^UodVtqq3YH6dB;HpAE%gsdO%R)1ZZj!;x`32lhTILBLBr5?hU^8fbBKd)DDQWFs zEyi#g0TYSCj8IqtVZHMlIRsY^dO(siActIFL1CMA4YG6b2SN@tLh*MZ{;v6~2YKM4 zp~t^gkAJPUAMrif0lH_HWgbEN>*upR#CMzVZ_?x6gm=G%2_FXr;jkl={|Mrb&1cIH z-)qJ{uE#&Fok09DjqFhJw@HdWgZOjv9M6P5O;Y{u*5lu;y$bPV?bV3SUna?tbq-u@ z?HrruxF!K&O-2#=282?R-@xd#E?a&kM9;K%vkSI1FFdk0h{t$5*Aa@zTj_GdA1*1k zcTjHcLW&C1H)!TYCI%_D_maUteA9FL0OhvH$n6oztpd++$gM&ItCnny(z9D67kYLh z@oKjS9|4QKm65f;t>P0*`#7?4q34f@xyono-bNhTMdH|Qwm7ySm>X=DKEbq4u=B($ zJp&FdnL`PwXw8!>NU|DFFk;bu-C)uF8JkDV`70{jdp}3*c?t#jIImOtJb6Du{hU8U^S@qD#%PU zi;tulSZWonybH){^_dVvIJEO@p>+_}`Vg*ti-O^4-HwMX9`PTkr>cncNvN!nR+(<0 z=glZN#QCHPuYPY`k7uvt@2xtzYHAX&S^G_5L zccIa5t}kmvK+y7gY)P``iUw{OvWL%*f^Ih{ASfA>Ae4QMK>=`dht$&*59E(uaUOXr;WIp1OVLuf$Vvs@b z&SY`<(r$W3;|NbC%+u-#vj3rP6>r2oL0iSh?A-v8oEZW5GFNIeH-w6mQ#X=y7o>L}llxsFKi7UPb zvDQI5>JcB3fXWhTdh#DSjE%)|=qy19SR9r9=uVVO1cU8dY?wBCui! z?@kmkh_0N77iW-BezB}P0K``eRDMgXl;5le!H}ynT-08(P_W} zXWDNtM{Ks;foX5$;aJ!-h<3Q1cmIAI7G~b)8pladr0~27bGD?h2bUbRE2^=h{zW>? z9L!GW{mkKFWL&|z;=R^gsrW8qF;W3+-vtfCN_YS=!jMjuahr^*`w2V*17wv zK67!`>kL{QX$+Fz*^$Q1<==TX*F)Ctg&o~J5FErV6%5zaG6A*nl~Rxg+4@$6pn*)awD9F)zd@%onT?$*8O@$Mc>*c8N*i(r44oEMPLMhJ(#M+ON zLllb7+IBWCp-=$hGd(kFbD23xjXBfTHrk!2N8~e|^PKdES9Fti%ym6?KG*HsF?XO) zIy*aZJmaw{V%(?of%eXx9-W;#F?V_nybkPVKr+EeUqvIGmrZj|%rPJI!Y+Y{!rN#< z2Mt?QFjy;>I zvbp->;8Z|;RO;&Pg0f;Xus?5rO0qeCSKckfy1L7B`a$uAeKkI}pFbOx)d#{MdN?!{ z@&LE3KOE9aVL)Z&DhsN9a69-yR-koP=2;_h@qbn@d)YaB= zw}HE>xVyTM!Xw<@#JoNaQ6*Thbd7iE>la|)z*Hk$FhWoRwc*`?93l7Tq&8s7#zg>= zA)VR?(K8<$ml)Ej7DzDq$q;Z;wdyq4ug$_fEXzvg49VYP!nu?v=Hzb~Bud@g)}NCwO(0>`nzwC>O!21ugqRsk`?5an@Rv9;%&n6tBh-?- zbI}-P{h5GcmhGe+#N07fHCdC?ToX&8j=W6w7riR|h50*n4ZqHzwotLn&K&;1Q_BftU_an#y30?cV3DAVdhPIU6Rj7NCdMp`lX&AR}t&T3kna8#)p z59$l&N98?qAy@>rYmL6>Tq@lWa38=`Kxc8$O5Dhq1s>c3z!8fsy$m>S19zce`O6Ha znDGuf+deWidlz0r+Cc#~RKHC1niB~JabKkDm5B!1 zNJgY+EBfq*B^__w1Mo!R>}ST8VYHMQLp*`dgIMv+$N7e(PnVLEz!gmg$ByFYHgh@@ z9UXIv=?2n5BHHcJn}TPJj?SuL<5PMw>FG#F-O(;TkqL@FTvk)&4sasD;|_+aB#))G z&!8Yrn))Et={^Zc!CUUB!1fYSebt^Y6%zKzx>5jl*V@zWtQ*`_!eceK zmbJJOSa$7jC!j4$KjUvP?!FfH0L;LVxw*`gxwq8FKy#VanP$7Lj4h#OjDgqBOhGk@ zvY8PEF5$}SY>SZ;nKj3{Uz7K%&-lgJe^Voq=0VNb9hhfym#lDbJ@jgo7o;l7%d_Ot zxr}acvOTPBkxos|5(I_Cb5V!^;`S&(0grfKg6OY#++dCj;x zgorG*Lu|)`|8WiomdQWbR@+-k-ebSHEiO$s{R*CIOG=~3OaPb}7stWO6qi)7&aNft z+n0oJMso2TT_M14);H4XiA2vLGchPSps-*A4OOKDzXJg3~az$fe&w#uqe`5wL z?LqTo0nUtZs^Auxs94g|#=cPcV2Q^&q*#Z+zjnL*;ULke3g}c^D#5?@s4_^^0PwSk zFQnAsQJo(iIB;A!8C>YH9A3Xbqw4FDyEXM>G10Jw2rGqvZ+BTls!FE?$U)*-(rKX+ zsd?|OB*zKv4>7F0@Zg~E^Mj&{Q>3_b)|l(ni}hN8qXGKaEgIPubest;oC%ys4Ttzd zZY0vr1d~rhXM)aCY0pm2oE(`uYT%ukXTui#STN9<4_@Z!pcm1fUjzoxAlwADRzEM; zEz-%6Q}$sYwnpUJr%z0+d|I${VoC1JKrnhu(a=6Ulv{K&X-FVC~V~?t#DCv6J}IUovDKH7*(0q1irBx%&sNkA zhjN9`e1U}+93~QVw_#y1>&hw5YMavP`4kYC;N6^dx7I+x(oJSnM5v;R^zzNGsucn* zsC9Hztrzitm3C{jwyxCqtfyIk&X9^40U!W}aqH@PwYo*E{yZ2<_zB(fv=^uO0&#&- zUI{=6txc$?UJ}Rj*I&Myaj-L3A%%c9KjKyR8u<}_5j-Ngz(UAOe@bqj14JA^H&0E^ z%yIwltp3B?I9xBmYA*Qtj$Ccyq|QS6sX((3%p<{2ib2{oM_v5RXto_IXB6%?bCSZ6 zTLDG`*m<;vQ!8PNminJO`Hx6{Y|uG+Cvb2+OWT5OwHB&4?*osbhHGo;>fLz#FKPuk zFNuxrEd+HWZX5Y~DHeF8i4MN!z|ozD4uA2?DB6+E=_#_Is;z2~T%S^bft$)kI= z4_|lq;L)AikM7)IfAU^;c+auqQDBZAc?pBZ`=Pjj1haSg^O}mmGi=^*h($9}UtXm4 zykGyH+i1=!-Q2ah;xP~kU{?3SG8l*k0MSXn(1VGwC~USARpZLb$2e&$yUg|cog6%{ z-8$~BCayNFrI40_@nsmX z1m%$uJ!E`YN=Y7iQ-#rG54J=JU@smrz6^X9k70Zn@`a#aQp`ifm$6q8?;9{MAY>#N z7z?J6Ww&i)S+$KUhixOvHMWuETHDBSoo!^f-ZrwVOt`W6U=@;#nGX~Yx1k(BnDrLs z1EPoD$=sgsT6&6)kuDB8%p#8SXiJ+*WA0d6gxg;Jdquxp4yMsQt1ix)j)P-l6T-_x z=(AsajOn!Z%JZDU=0*HygB;s)6RdxPL{qr;VO4Ewq4i+=9Di?GUD<{l&_}}q%WRFRuP~mR3T-q3JDxhvBlFO zf-=SaMrQ+m@dW(`St>zBFk!eULU}GAC@^IwK*Jv~Jr369YVL33uFl$A$NlTMyMeo# zxVstlm=)&oxYa>y#R7i>W&9CTghgcFCBYW50$a#rQ&I76hj^~5EC~r^)CPRg06!*( z0V&IL^YjuI2`Z4k6g6+UoGg!-7VlqW5Lebj%Nrhx6EHG4Im@x$^La>hj;DGD^T}p` z6sDVc`L}wL7v8_UpfJp+;(9^LRmxOOnfN04?cpd0YCAgt2X;0_CRP~(Cj(rCRBkmL}s_DqRIhrr@P z2DRk4+#IL1Grb2Eo%9S`!#oES+BTGhci76qr+axOYl=0s-Kr$NnpiSx5V5}465@P7UX$y1Ay-ASB`< z-XMDt2|`Tw+5_sba<%SeF<3f;gkY54%>eD~Futry8!<~r5K@1T69khOD<6-I5NW`B zBenopm13~D?1?eX7ghy=68HJsq5D-PdA(5P$NywW!Al>985i6&(6fMvWiOO+eBfI7 zU}o6|oJBX7OkhfsuMr!YB5S$3j=Rm=UC-SO+}+6CP26qa?q=?8;chE;w{o|QyY1ZV zV3k#LCk%)j#Z*waY$B7m-jb*c2(WW3;b_NQu#6w@0Xpnm~V&EplHR)Q z;d*SGtLRY-JT}~X^}t31HW6D7f!KrfK&U@y8%$hEGZ1Kxu&1mWIkwCpw;?cUAV_lU zB;ugy)|7R_$(A`}-I_8sU=-v5DP+9e%IWHKRkkWh4)N(LkzVK1zi3cJj$PSd58}EJ z+Vmg*P8LnfYwTLbf^D-S_vJ@6X=sPQa&a-{Qd_mdHbsA4_E@8wcIFbn?rE-vIx?vP zC@9=gooCn#UB+-(UViO)zl>{Y2~-?&KX$^!EY}t7=I!^AA`@$#c04Ea%d$C}O{4?> zK;Ys%4xpTpyXNH&kaO3xtCrt|#wIHEbV)JTsOSPWtGgR}X%`eudpjlUo@M!6uB!@& zU2%PTgm@-6KX{;44T}hdG#5lNb@TN6DI0sE)ToLPPa|ik(i^qn@^X<(xg5-SJWIRi zegYBxDzUmIT+7`$?$&d+fxD}?yPCUexZA}1WwdcYVU>)p3)pvvPQtwe6q9~0!IlQ@ zzl`e%-UP6tLH3$}s}x9R;E#%*j=czCn{g~UpS~CQXfJ}}5{c`CeFq3FwC|Mb`%X~b zcPen7!5Y?gi(2df^@aNiS1T#pSJonCv$?N0_kaN5ltsy*J;0XV_?khPStNYk&FDzx z&eLSH)m;9aYpi%qQoqlNXR>y$RC~d3&FVKZH`l$s((~mnHt&Bu3DS; zFWTJpLYYhbq0#3ER$wbEbGJ*k{RZZR-k)enb7!nLuW9AyNb?@CXUfd)AOW?Y&vd&n zFakX1kfe3=Wt$EeMG|g?Q@87D$q2VIcvYL>No;Ub7;n^ zqGuLTwX=AH9ABx2t%ygbIedY+`I2e3l3Uyr%|yFaMVEuI!AYGENC)3OPf$3>d3ifw zrP{C`waiF3x(y%$pfEeT>Xz+fsHAiS3%i0y&>pur1xkw{bVPe3STEvY@Je|&SQB(t zaQU`SxGG#1UX>@|2Evq^qao50!a@NOa^pJxa*gV%B?K)$UJhvQC2~{*!>Cmib+!MH zCn|zD!xd9hU3(u;@q!HE%;O2?{HzRG`k>lG!P6wJZCH(=T;ISmIn2$Qa(u+7+NTXnTQnKX$z5!Olh`Grox zs_fRfxn$k!Gg=Qkiwh$zt#2W%&M)p&#grRL#8)jKKSf4e)*pWSx2WRg=2l_By7bVQdJ)T1lF019um&` zj`Ma7hcEKTQyqjT5h*w;U=38&vT&^c^*`M6xws}YoFS(I*cCjD!pxQwR$WjY3aYx07`{Q0 z%+O>2t?PC12T|GtMIavHd6ekS1qgVyAPoDhBTVLDq`&Nr%|}hKFu?p9nn7HfkdvPf zERK?NF)0es|0Yyq_Egn6g9vq8MCV41&$b^Kn>lf6Zr=%5Dx5t!a-374a`InQ*w@KZ7SLc?L5~V zP(S9|gM&HcwX^P8DU&6Yr7I_AP3jMfmyrP;5qnlDc9xHReuJsx%S(t7SELy)f37&M z#WWEL2j1L=V%@Q-V(kLP6zmGdViimJTI%ZT0t*tn#?D@SlF)EMGz7Yk@$T}1PAo5& zqtell_FGLqYaSB3RZQ7$Lp5ZrPJ;tBjkzba$j2@<%I2>K4{j%!r~z^I__ zHo5sGLw8=q<;y|o5xVk<8p>4&Y9;xq;KMcq1qe$4(olWmA&uNM6d<{O9e10#+d}tk zT$xqeumRZPAv_|wXXDipM4cN#Br-UFZU~Vmz7Y_9E-#@M5kZ#%QWZo^AT&an5zOtz zSG-{mB?Ss|h&3lCh}A^`e6G+hWnu?{*GD@UfKd4rn?OgK@uiZ|xP(frnv2{)c)djn zFAy`1d+8+vJ0=>BxWGv@@7goxOg=&IeKPXT-+({>LD2@ zKZt8#o64Gs%@e4p{GM)J*6Fq`8yve2(4LJA-@2>;{z2as5g6S6@;p2CBTvj%eQk3{ zOwxu1gynu<$Yo}V-&%cUl@L$x=ojGR%<(caIMat*Z6!+B^FCgZ9=M{mIIeGcTexOK zXDlwmG^Z=<5pcbcICGs4MCeJ(ox?ebDd-dZfilc(a9)xP=xULqfy7!sJ@Bi7NLK}# zK3RaG>-r6aa(n>o=R-uo&s<}KWS@7Aj7^w4l;CBkdpN;4^xQB&g0ZkIln&hklpGmH z$w{Y*ik`-jinVX(s!_R;V{sW3cIu~C73QN5>+O*U$^{D47z3`Y$+bUJaPEkDaSVZ! z#NL7+3EROQ3;|@;BRK}FD9Ei76AcbA(R@IZl3@ct31ScOj4Gq@I>gfai{s~$SjE1$ zB3JwiaHAAh)GDJZ7ltff_L5-j^Ou!_XVRVoNC44vwh)Rrlx>@=>7B_r@=o!RFHeFu5QnV z5tZ5+w;Kp4u!&qBZjzx|Y1l(%Fpdn;!%~WYfNFri+oeiXfhFW>RSA=@euD}m1|_2U z*Lv28B&HA0Nu}Pi8Oqq$E5K{QTVQ$PJ$y5fbou-(B&FZV{aab65-^Ie)CES7DGU(; z(|$Q&2xz5&H~^cT)X_v2c==yo;MQ=gbcL|eU19@NyXjE4kG7rF=d+@YH`llTFQ*>X z!l%;_&F8a9))i_3O2dYQ)?jNzYv_Dd&AA~fhCwESbn_FPTZpZ!Vr9e&T+4URQS@eeM zaOOBzqk??v?3QMACWE{6SZ3uF8*-?q7+D&ueh0FPYJ4fVq%Na9PL&k9J^E<}MA)!Q zk~{{@0o7qbQ^ot1#Ay!9RvUs!PQn-%Kk+adSK-9NC7dW(m!@)kkyd4pwaS3;D0YZF z3@!j2Vz?1N-yvUt;PC0GIb0kMogSGaF!FJd9OoklMHOLHQF|3dlVlu&ec3WN?WRzE zf3Y$!6ZF^JJMeO%KlN;LTyo5`eZ|tY7Yj7z0l%+0pMy*1WWE5obj>Y!X70|Zs$$s} zlgxLr1xgo#_n?u|jvv&i-3Kek(|C&NY#;66F+)g|B@ijk`)WNSaI1Yqd$gywz&*NCoA2DIn% ztoZYhg%w3{uL#V=rWf;QOGjNW9V(KiP5}~}L*eM$>VoX0|x_ z8Xku9->DJ)fC@J7tQpw|&Wt;=aNuk?s3zxlSSVH)n}pTwJZjw0yX{Lli+Ei6<@>Ty zoAUX^^|tdWYE{nYD=N8Sk6F2l5qdcpp%OZEt|Ruzkgl9l$Eb5Nvwr^9=;Q$ZLHK(# z0+}L^4mzr&bYeEik8*uKcAcI&fv0riT|M8bLiK^^2p_S`Y-DaaqK|FHKf=TGVncVG zn493gt&)||(=2t(a6TLa_Y^!Uc61q96+TUP(eDPsw9L$o7qi+~bYEf73XkL7esKSF`*t4PS&vRIOT`>_ z_CvtgH<{UGE)1{?fXhLdLHx}3sk+KrPl$7kI%IHVUP zAK0^fXU*7523?33!MPEnuK8wSnSB$; z&*;F)t+!%0M{K#y&9C$CbU@~8&JZ`uFK38$IU8!U^uH(SVDPz zOJ{3ljKcIo-73&+*4bmV)ITycJ$3fv^l6~-MD@j0tfnu0aTUuYWfi;Z1hit5Xm5oT z$s}7$^B?r#5@tC?TWWbqo}D{AdI_m1nqgzcvNCcBs|12tuq9P_Y^g~p6{~v=B3{5< zpVftwumdimqPO3%?sT3%;$CjQI*KDg#Jm*AAO&a3hjAi0IIsb;1<}pUd+R|tyGew4$$l}>}o^#&Bhpo$z`@ZcTG#rpqNy3iP20 z_!llb!2uxm>$to|;4D}8vCIqY*JH+3t}XOO=K!k$(^$xQ?2bI{s%m5ta&$6oGR**k zU6n@+aq5GlH1uMPJNV`9&&%v}9o*H)VdbY5GX zS1*H$0V&B2QrYQ^!CDiHD8*n~Nk$ODIubC~)EV!tSaJoEW4)a)z!dH5vUe8aHYCSm zU1Y(js|UK0{EUU|rZ`M8#o}EuUghI*XEfR!Hog^5Rd@5T!TXSh3&Ai4GW$N`O1> zb8Mk<0`h%wqPsI8_rTti+>_|)wclms9v~hneAURkWJe0>#2pIsiMz?|>`D0c+gp1{ z4nGWDp<1xrny58Im`G_c7+xD*?`{vr+dFDt1&x3Tt^!b_y6OnMLRzJ&O{%(1 zbvLW(236XqN}E&{Y*1}crB+qis(RW~Z(NnSRH<9_CRDjc_4TUWepR|kW!qH$)hZiM zeMwc_u1Y)9vPMKam|VO6?Kl}1!) zRCSH1{^Kf}P+hmHo;$exs*`G2MlDOJ{_9oGjOv+Hr8(7gMwRYTJ!e(Vt5nx(RQ5Zn zbPr?}UdPnH>+$zKrk3B2e-A(c;!XJXW+)K66@MRs8r0jFTJavHhThNc_ThR2%1aL; z=A-!gVZ`_d!XAVFQ~391`1cnGdkTO52LHZ@e}9MH$5rX9Dm@L~0z#0tgnXrEm|FFZ zNc~;r`7RUJ5`Rt*D#4wCbuB*&=cYPkL_zngolus;WG`SrqE*gcc@^EUb;2=8RM zYRMnCDgIuTJICI|-p#~YZoTCXSndHf$!-z;kUY$P+aIyqhY(v7HvTaaKg#}ueT+TM zEbqr{@1NS{-=SWa_LsmK3U3IF%HtS=#(W9fLw0TQ!*!>e=d(NuhzQxsF%8aVjaSVv*^ju$nbpofOuvwL6kRBU?9| z6e6q{>#>QQqSwjw8`e76+z@eh?E_mmj@QXfdY$a%FOXRgDvJpcV3#3uo>ulMfYOAW zG)SG#XR))16K<`4KJD4-5hlFaRff-}ZKJnM5?La__G^%5645zN9FMbPuVx4F#H)oJ zS_(4qlC}%+NuQj@--Gzq&U46EZseKbAJF3;(5^##w{{5eU9zgU9;dg{8%d5M@Ju9E zP6oqP3pZY1YX~W=Q5?U(B2renB@MgKL54Wmt?7!zbSPb(El-75szRi&bh>geRmndO zFJ`Nng(~98kEE+xTlQANiHV9xWbmbHwHf${Dcb&V?Ps8DU6V>`os&&INWZe4B3#^09USOT#oHn;GpY_7j z7a1H|#i-CT=d-I(rwypn-RU)Z*9b_ZolQ3`W+Tl)x+&e1ZOX3Q+r(0hQj7Mg#ogNP zps;nQ!SA9I&!?Ih#m})tJtDrXXB(TxQyb(K?H)$BZ*B>rLMj9Ia>Hef!o5tpkEJ&* zq&5kt3=EfT1dQ+f^n~k?M3<}Q0!s;RrZ&74vC=Ks7DP-#J~z9W$9&Kc3J^CV{X>)< z`ou0b+3R}%McuIZ8O(y+>;aZx3nyVLtxQBV*!?2qY787){|F zh<7b}2jk}Ee6XR@O0SoG7rK=mTVQAo(GCjlN3`o0xrfB}GwlOxUVE6$r`xh^+4cqC z)6S*n|9pJnG$ z38wuy4BDl7nD!TtqV8qdU(&?O^^GYoUN@?sWkCf!*N<{O&&$aOpGU4)_65dm*tr){ z{d{74(V7?wsjIAs@wa?pR7jAXXh2IM9Y|e`3GodY(2yjlZqi2l z3e$&kihYG;1U{T8;VTTr@GwP^*(9dOKm|yZg#`wSd6?)6sqL8ZFqr44;j_S?z6M=UO`?(w zNc3HvXj1qt)4q?GsU0l4GnEn$C2U6du@U9RO#6uyWj95sF{Aw4i1Kr$UC^VX_6XU% zh*C>YHlmHw~O{M5S(I?+(%K{RJ^yeV*^$ ze@pVSYiJv3L-MD2@&}mkG}2A7r$ucZMahf2s0Dak3yUK+Yv)DU7#o3m;M#>$-!)Tx z7pYFN?~B^^dDQI9xm%vmejqNsI|MWY?T6G&A7t7;iwnotF;V-G7+K(h^Anz3gl0z% zvb(^u1HE`b)P5x{WYgK9kc{-d7I$g?E#ibbp#2tq_+TxhhS3TCOO0s4kt#O+U&^byW3N69G5clg?L%xkBHt^ znC6OX2=*^ux&DHJaQEh%25n6F&!6@L|0poX{m6?;r&_*pStaV|_tw#|DU!yqh zx_EY0$whbBjDN%T`-jm4uKd3RtZ^a3D*lI3O3M9pyMP%&M!=c93eHL8YtM1xXS?s zO!nm5bXjw%HdQr{n$s#ny-By-NS0c-q{s-7v!I?0prZmyEh2za2n3r$8p#A{L?m=0 zSO1J)JwoNlr4q(H%&-6|MA!(^#01>i!tD~1NZ7YD;T0JpSmqEl zO6y-z8s>wTo#Jm`z!p0_1=Z5&DMPeom|n(`)^T=e)o))?M6vT!H!igD(k(6<)V6Hr zfvkD?u>VS~&MO)vdrsuhVMeo-cA>dyJL6ph3SpX!NObpBEa`4zw<~>Mc6CRkj_wZ9 z*Av}k;qq{Z#4HtE%#y?67-wdX8y~7u6~c1niyWt<=;6={3aqyTbP-FXQmhJB*KoI% zyY;InWDWN>(&~qu7cOau1uuZThTVd>NkpFZ1bs8WR+G0INZ5Ml4j-mdQYOnVsIFGS zS1&(HVPh~S+M?~moZ_$wWN@A!1p%u-l9r8H6R;H`U^%4}x^_60ePG#T|L;^U>|@sS z&l{;d`|*5%w~<|3U&DS(H4oa5a7Cby#aD6va;0K==mLGNGb59yGqaE#GE9s**KFT% z$?e&ANzwae^u4aQuw%$9#qN~i#PjmiF>@&F+_sn2EJ*kBJ-OsEzM^5WJMNMuhqa0m z-L=cLk&L-WVV9c#*2oMP-lsUAZqO6N62Oea*{Qr9M-u2&{1SDALhe=|0_;aXS{j@Y znz~q4T!LAbX66vKH1!P#TX$L^2wPM2^IJsDE<4`~<&?~M?#~)T^{aaHI1*z32C$8zhJ=@Zb!i*D zAgkb3#{JHW(Hh4MI-yg_NZ99$WT-L}2KNDeDKkSAGri6ik6SKn~3_I!D44j29h>k^tc!rmYbk4?^yJroLhd;;}k8r z=AqGUP`SpMm-5&AAC@F-Ev5jMk}oo28tiH9JUDEw$dZItL^KsY6x*qqoIg}p8hSfq z4fFJj!5FFlSH_rHMo4k7-Q`=s86|~<6(e$&v6x8}<~*pvJaCAtJn8dhPRYr8MV)OA zZQjwg?3^&Bw$zpAvey=vLcQI~FpnswsuY~UUbrOsHPHoRv}mVpoY$ut=OyEo+~^r6 zU7;1Eij@RFFV=9n75imAuZJ5J330coRxGaw>ZV5OIg|}ZO_SNYn_cI5Iq8_o2$W;Y4ZFWsZq(IhYR1%#!J; z$+N9C*;lMJ`JJF^f*8_KmwL-|Pz*&&FtW>ING{Q@c;zJ7*R9Y2B=4o`!5G5q`u*Jy zX z1UioEJQu86OIP)ZMgwTT%Gx9(QAZr$bozyJGvB7tpdbzYiVi36O~sWdJii8C^Ajd^FhuB^jUP z+pB)>Ze@vzO4g_$F)nQe@0gnrrH(1Dg7+(T?fM0vXIHL?n}L86b&=MzTb? zq(iPa2-hvlsz5_u-^a0|BS<)&&H`LX(#<1w#`>6It$9R=HpGl7{N z8rL&pqeFF&5Q65=GQk7_%kkuKz_3mwpKH04d|xuJir7;Q`d0_{VaSBM6QE!05~0Nq z@X!hEAPmX@{e?yY=wEnR2VV#SfVD1D+fSQG0D!>1s$&I~_qY5)Mw5RNzc{@@3(Sq1bL zSlUHX1JHNX)NV4a7C2t(MKcH}Z}4@IB((~QegaX*fWnbzvjn-u;X9Q6?5O;6SNTu9 z-o)*c{ChW&3#I_gb5^dnT1G=~|49m*hwBOEinK8m{&2vd8WT%Xhq zAMPJGyMA=)m`G(`Sihh|K7h8VO4}9nLvyq994>HJ;IPQyH4Z<_;Sz_-9IkM9ox>X( zex#)E?;3}P6$;StTKw(z5_|CMRbB z?1b|S(IlRrb45#Q5^XU84oN0>=vaw-60)7sbfkFJgJ7Paa|NJxCP}%^)43w3oVRBn z;V$Z_O-ITdz#u1d)e_y0D@!1S69^LOlD)D4$Y#+5N(#`opq>j6^i8J>go*h$gO%dS z#{m$l7ZfJcj|%|)oLn(~F2l|B87J3gI2VNp^)tf$oSUo8pDSR1l!xk)FuvUkb?sGtR1m3-0?|CV$AEnx$@NBLXme#pHqae3Xq<=MX@@3+$Zut53s zDF16t{;vu9>vUcN&5*qD=gy5k7xsUo8&S8!zi@8+g#c)dYiy?yWA1$b*zn4_mAirf zY}BGox?kts|7*TKs{FMe1RLGoMfcQae|}DKjBSG2?~#?|0L{x2DO>kz z0Cz(jnPMhKfBi7wrW#4KPHs-Vi1d9g+CN50p(dR19n{5>IEW7v2h#Z?#Uttblf@@F zU{2XayoUX_P(Y!-kQSfm}_z=>CGz;cWUEnHdoAJyX8@TYwwqb1+b+}D;# zU-{T5MBq+}OtP4y-@4-H9Ba@{__F#RN%H3OF1!0FzxZ#$pQlW7BllABfUwhiF4IKl z3Khc+ioJc%wpGfsKwSjMcKX3{qUNYq>BaM>vO9ZJt_jHrKk}eiP-lee+}=KMYwtR# zsm7}Ii8ag|YZZf5NGP4>wsh$J&rVu*F9Wrux^fUlet*ITFB#1%^Y!68QccV0e=?Wa zk6Pr~`<7Yuc9j2VR`62(GWp+*@?9wBi!h90=P#8&7rvLegZJmpfezZ`Kp`2hbO0nk z+rMII@#^B-;u0w2okEZ8pxYQk;mhyKPF?Y+MWB(p{f%TRafklLX=Qbxe8t=%p&s1I zDg{tGAH5K?H0rbz&P>2^wu7%)wo4|bRuC=p$@_PDIR)x-*O7^ex(Cpj9SjHG^iI`F zVPFj%y#HgV-T;4Ts9(BVxj%4c2kVK8c0n7b%XQbB*2^g>y2mX8E!(yIc!>C4%eIE$ zJ6L1Nu2QIj;oi|*PuZ}22l*k^nJ#Cl&cNk&r4#ZJ2jmmiFpc-WPSi2AQhK?tdLIX; zGLcVH8>61`X7l?}60{U}j#(-kd-YUBPNHp1dN<2UF&0Qk#9DdJV?k)}ZcI7o%TkjU z=k-RZ)rDX;(p^ZZ(Hv2?spgjbFQ zAHkU4zp+n{?d!OTXOzznD%}KE^y1o0IEwWMNzHv9{n){eeyqpBFL;SR`Y{a`>cm97 z+;bl^{&jY6rY0rt8K0G{<)rTg8B&pX9UBegZd~rx*bc8ru8x4SarCL8uvSR+nMfvWJDVoPsa(nnoK6! ztr6>qJ`Q(R^i^*l{$DzL0bL^2GWc((3w*|`sxI-n&Ln9f22)McFU{4hA zG`7c7_nBh9DGr+AkSY32HEpUu$PSz8xT#Kx!>ss1wl{VM(yO#S!p^ZO$Bd$1Fca$q3sb@-1o^zeE} zF=41~0Dd1*^aRB<;40LFt56HBB5k;ebmA(u8-k|2_}2vy7lfZisGCy4xYh{u(p4W_ z9mZAD0Ir%cxJqVml^mk0QMww#RqRPzbsSwkB8<-C>(e53@WS^#En<<2>nBA_e_{O@ zgzsNJBVx%9te+FH4t4#A5}Q?(*gWzbd};k@MPFli@$gOc)+;Z+%Hel$h}rAA*TwgI zui(F4lRw`le_oeAx8={r<S$e&-6Kff-2enbBJru_LW`SaWI=Xd1KSLM&|ia!w4!+$9M z{F)Hc$Ah59O^*;|figmr1p@MLK(E#DV*qz+`Z!S+7=fdT36qXq@||q~)zWed((%@oX~^l?8aS%G^%&R>Iwq#Ue$d%?RKc*` zHF*pMxVuwNOoIhsk2tD8cD^?Q76f%)*OSwrLD;Wy+<_ys8XlG7g`egpyAF8rwWK@!!wwkL331>edp^?_~>mB9$fEJMl& z2o;F>U>xb$jWbatOd1Q{Ju&yU@xJz2B84O*C9UU#($dPKg;oP#Mil{ z{0PNE_Tz`mM4an8#=K8vm>+6E7=Qpo4*ndj7n%rFfiE@1dxf+oRrsJ}O zknM9_e<|$$g>p688PGH>QvMUB<+*O<78<{s8b(07U*<|rD!;6fVR^A<^DW$kv9)fT#@*lM zyU!@Ut=eD3-CiomWE1(`&9`nPV03Q(E;_^heY*Ju-35HGXY&nt>ksJG*Hq%=-a{pl zg6Yq=#52mDsrH{E)1ggC?Xj2cleX#`eE*#C4b}dialelWt*2+fHKnD-?}M8PBmS;9 zqWqPLEZ_wU#a*s(8&Z>#n{lKDNQ#AyAt znon;OGkt~4Tv}UCzHR>xbu*v6lOHS&=CbPS5ZR|IO1FWkmrxc=)YJCAsQF?0Ur~RQ zI<;@*HaX4ND8~7(>$l@T9QWP0ZT}lmpl8E$uea|bZ@$Ji)YmqOBX8R8;bz~h1VE4Z z(c&nsL2KbA$PE*3%t6ekj{EuD`4jo$#p7uT$Z&5OEumrm$Bkcc(9OVwz+nMlv7cK- z$gmr~&-q;~9!7jiiVHh8iKX&oEtQD)$`VQcf`j!d@R7jnsCWJ-ANNZkijj?sf*{;W znsEQ}(uO%oCho5F5L=#F0tKZ|&_OVvzKQ3`wNlrBr`W5QWL*6{C}@~Pb8B#vns&@S5GIJsAb4T(k$ zn>b8z*vw%IhpilTlKmVuUV#AiXF@T_b)CTe1~wt8+_{kp10>Kb+S6eQ1AIA%y$W(v zY*j$+LEJ0`txGT#B7-^v0o8yf5bRt`>A=8}p5lYjQ+x;?6K`NhV;aLJ9(NrY(27Kn zO^9rEJ=VFAuzk08-Rmh{%ZF>&*-m4ct<MtLSfAx~^ z(K$S(LdNj~7sk?CGstWR|OM7jL_>Lr%%`=$6&xV0c%h zSnCAtC&q>humrLQO9pd$z_;L`*C2*7@|_vjW$L?wyW|7|mb&1&uISiO8K9>l6MW1s zm|pHN$!(Q}xg2(+$UJusU+)#+2s!UH|DyOX99hwuU$3iva`(Poc3lhD!Q0Oki^K?rw($xNE&_ahEF4qD-L zz_IuUF-Aq!DP#5|avR>dU!RZW+3_y|TKB^!Q?C0Tz}BkvM6!jBxBR|bl*Un?de`@2 zCu-(V#8P2WUb07W}SOn8&tYvh=X^U%W*v)G)SKU6>;I07nhc1Ru`{cEvzglDJkD)_XBzUJ2Kn}J%-;rn=e;z(~si*Id;Pm8jninlxoOE9(u^6>e`M>6Q-cthl+=%|@)eB2*_W zA1&W^=%7=JC9sySrDj)BTg&Qml1xCK;M30TsPnz$#%r#e+?NaRFv8x!oORN{;Wx^m zMsq(|)$c@a=_*-jC{Iq&v!W>IXJBUmJMhA#^4e3eHf`zQ-TTVQ9=^qvB5WNSx- z=3zTgx^VMGVfEtUsbNctEABEzeZ$Wp||=9UYWM60Eh^xr2V0z3N3Lz%y5qx z%$UJJGcsXDCW8}zcRyj#sts<82v&0glzuF!KZxI6{5!-)hG3t1c%VPcVV1)o4u?4$ z;c%40u_r0z5x#y(B%6aM+SGYrSFp^3<5o1$SwU3^?yN<4eGe1d*ej8ow{T|V%58`34dsP8#xu?hr@E&mt?Mz zP_{^DUX4g*U%|3Hfo1;*NI8opkzM^3Nd@dDH*!IxCq9GABk~rAdE~99HgaLy8po}p z@|ICFYkIDZxMHdAg5eY=88Gk-DK^p4x^Gj)+TD?U42aFxqBKrS-rxF&6eN)c%*#XgJX?T z-t_D%c-to#s9v9MHuII_ZHmHYoC6v*WWT^A#f->yNMb+YU;14I0U0J=1k%-1b4*sW}qS1D40|Ys_D*P2Ye9k!UqRFHS%u>FXnv2 z!yE}BCO^a4ZWU~6DUR7ALSfjsSZu~m8X%v+;$paTf{T)YY*TIU&91)fiR+FJNNE%)lY9?o18Zu{}eJ=yE+W4 zNQsO1lpRe(*}-9TY>?)mU{Y-kTJ^-6 z0bjR5kJCIvC>ao?hD|-fp3&oE78yteo5A?F%hXb)zSq?D1^23uFVk$K=@w=qB>N|~r$CF^+TPZ|VJC;XIo#7l@%#DufQZI0JB5UfjVR4dkYv+zgxx3hqu7aJKZ>bJ z7g3t3bc1A3n(kV~VfRDI%#fU_LNrx{>@bO&BCITpV!l%C7|mCt_-sJhIQEy=szIwH zipE=S(AJYwbBA!Nk&3BP8tvpJh~?l;-4uNZy9Gb+z)s0=)x)H6|Zmd0T=82q7p#*v3t-{jv8)PRtKnB%pJ#zSZ zsdSh~qk zuFUyfFZyA$N{%JH%c0 ztA-09Mg=JV^4b>iiaPAYZr5TwD9Q2U*nfaLunpK@W4RZpjt5GQ@*VZ){W^nQ4;B9) z$x%8PkZk*rKK!tAbfx8CSAAHxA8=-5RLhPGX`|_^HVP$bc93)<rQVm<>M6$01rs@DQkun6TR-P|tc~a|% z&>O-P(z#+2eZYio3gfV;14cOj#((hVDTZN$KZ(_Z{twLwOzGq6QN@7p15Ds>JY_V~ zRSR9U(iJ(QLbgbU+PQmIio-n|?&WYFhg}@*=dhc@gBEatzN1Uyeztc*JuSIrAc7q+qzvxcMPQt%3Xl~s8_6jG)ZDd-*8zaa8ToA z?GBVOO_%k%5JV(-!NdlC0J&QzcT{Py+crt9n+sqKY~LhhE?;)A%X+@-q%A)gt%s2f zbgQlwm^>TQBPvBDH7O~s5@`)L?Ovosd6=pLZrXh^?Y_$zaBxU#x@q?#th3g&bLMvR|c-QGKugJ-{k!u zYjbgB@(R8XaV0=2ZgC}ul|yJQTVecHIXm z_c60RFW)0G0!$$OAq(Cq5!?5l{N zRB&iW<#85A{=7VUBPI!}AnfNGgH#mL#yHeI6O_j-+jVVU&hrelq#g_KEB#BeD_330 zdxPT*uGd<2dK645WH=H%b8h;XD`!s3OdX$^nF?ctpwem8Y`dqNem8HzO*6Fu9S*}J zBL0TmLt#`0ik=euW`CFr)8V`pG9>ph%C{&tx!Jbpf!W{o3XY^nzUSe4$a6a|JokDG zX9w30*jcjYISfNz=|0jJwcx&8?mAQVy+rp28k}7NdCwdSWk4b3KIJ7MM~oH;?=?bONGWu^0jRlCvx1l zgQF|mz@v5M{m-57I?-}(R~I_4<94%vLjgW2gI)Aq+2*NdQ{8JAhj^-Ds+-vDy8BYy zlD$YiDOyMxX^N&UbDnipK5dHf_VWZlgP7mCBj_+e22h&4T9|mC@m2A0XvL4Ls4J!V zDez{II0|M}$FDErO*{JK(yQ=$z8rNVD)LqoLyS$ppxM2?;&BqRRR6TP(v4@Q&YZaL z+|=}m3tk_KJ_CB=#Wfuxdl__S%Qt4{*J9<-!Oy9qbtRv^cBgOqp3i${Um(48`eb~o zgHCbVu6vKPAo%1f^4SKew832+N3tU@$)nF-gL7MWi5U*jjK=5e5_Yg-=*pV~4c>7L z{&qB2c6pOOPuLo~*OH50&`S-I6&kj_l2$7_J~-4+rEX^v8#(dH{L;;Z0;4>&;jvL@ z5h4CnLA9Suwp#tkq2y$9Yw~IAZYOEyO5~+1d;yS9i<%^nfr(O+X}}k4iz%3pN^}q> z6=X32o@7&|w#U@>nZ!(W0742=>opC~QuUeUVN(o{^^(Y#;HR<%O)+i;Czzk=NusC< z)tjM&8R|AeM~R{;)MQh|o*iR%d>cI>yu zvEK&06K%rFLMVtUj8O=Eu!$uc^$8cd_ABN%2Sy|9U8Uz0w1=BXQ_m(V!l-55e1`l?#gX(A)OmeE4)&Sr5Ns_umEY zPA;O(M(qKq| z1l{<4;`*7~NO#Wz1zN96QbQ1Qt53cw4r)i<747;{_LFFTGboYPTi>yd+-1!6-C|p= zUAY~Hv}U8&ar-trUQXpZak)|4bx8$VQ>XeyqMennyYs2O;l2_3#G7^w&7CuHDed%b z0j2Aljtp$7tMA+|r6|x8tBqOWj66_W6Ry?=9{v?pxoxY}l9Fr0`fn z(K0!?$lM#ZWE7?3wC{@#<8jk>(=RH$^LlUk(6X>!L}{tMr;tq);|O&;-R-awBl#dpOCan-)Ic`Jct+Kc(a#lyw^&D?;a$sU-tDuD+h+@IM_|ySvD{}6!uF}$X$3r{L66sWCYKeA|EKYc4lLr% z5Z^P7(jdo}6gGu*E^XSii|o5;(8doYQgeLP1FR!3khaj;*Ee5Fk(^si@TvC6Mj-|YBR z#fnZ%jFsET8;^S-v>udr+m-W?p3Ap#QgfU&63ZI+8{zpWkPMMrR%3YzfbBsOmzdnF zb$mMzVn|05m<1t|h1djhIpphV3k0maG>xfBuiZxi2C@Uv2-S&{l_J<(D2UFOB+uqU z82C(1( zEmF?iHI(s=iTB^^vy`11Fd>U5^UMb1-`l>>hj?PC8lW?*(|zt{2Y{%6=f6t@e>qeo zc#)cvoWXAweB5i`kb{9hloU6#jI((Gfq_I|3WmRkLUOf;w;E;_T;xDmSHiTwAqc1u z$da^}9l4~etMAybA)YrjUz-oa_do0~@7^tHbNZ}q$H)Wn z+l~k11T9hbjFB^FR;3)muf_MU;k2=L$IT(19Kx3xU>vc?Z@{>@7p(<`rg2nx8;7CBk6H%6ms)%&`Q81LKX*#(cx&t>jAuRbf`>i z25O4o!7@=9=qZNA%k*PRQBh{{08K?^d?(spfGEdc&5&jrCXEm%3aD>Yk{C(}x?{%_ zH8qIUJ56=BLy4g7H`Q)zhDcKz2(4R+30Wc71{4!!1}1Qd0a*Bv)Vxt`YEHIr*verW zhwU78aJY-Z6o-2`?BejiLCV|1*S*4uv9XhJl-3;`1_+q3SU4Vl>|7USge2%zlvr7V z_&X>Pr`fU@yMigTyeemP}y>mbG&W1gJ z1gvqcLxLe_oJUyRPNt{8#OMY^KY{2Y8zgw8XlRsW^l?PzHb@*!(U9fJ=w}gqc7r6} z6z$k}n_ziO15wC64GFWydnMDZ!(Pd+leSQu+$&|bh1s~=;pYqUi#G}-cTU~sBYgLb zZ_KHswOKH&xXBBTXQ#Dg&a9{dA5k3ELKSht$aI=Z=9zU{-{849lICnn2CikYL+a2-0P+^q z3KI)BJ}8jBV4j1T5EfNH96-PV2c~fo4ord5CXjZAsqey^=NeU!1_fIo*gFLx>p{h$ zDNa=aK9eeGOx4aYofXDZkti8c5x9lsC7!+n?56;<0m22&hB1*CA|kOZnBY9I0)6;& zUI%W$wrFMvN+yZ21tw7{L~t`k&=i6>@DZO((4o~K4(NKj0k<}DIuv$|n2?xAq7L_y z$OT(}ku%At+-F9mtMIbqx z73ln99SFxzNhw@}+VNUHd3!DeDTb@{yST3P32gnC_wAr@Vc%!7?Sk^~(}5qE;x>J2 zQ{DYFoLQUPqKji%W@Ow!E)AwNxV;GR4eldtXmrrMm(>OborE;*v%^F34n~7EIF@yi zWk$4YCL{mAYt@FbLk(5Br*6y4qmGRmaOl@$wIl~HsV5lj2H^@2Eby?4We0vF;AH|* z{5?Qan%aI->ozrr@FBkkf+ZbH3)aU&fTFJxJCn&_kV0??P)vlwD96MoH0svj?k}Ke zjh}=Q1EJNEun^t_umpwL)b`GfT^y!3+{b|vU3AFa^OfILC3zkj{GE8s68y=Sn2>@K_LARh6#oMOeWYy z0{MFKK^k|KoZI(^^;XFoZ^7M_);;%lwwsf(SPUOWv=@*RiJr{k(%t=Qk9#m-MC)ThDU(=Fp?&TYiL)aQupfQm0899!cf#8{1=3y5s<>6v!_xd z>%o86gET<4!}uOmX(1FPKt6P|p=5r%06tA!1x#Xt6nX%>GIdHyk74(#`gHJuN=Yt>Y`RKt9F7)<% zOk6dcvfx#Rgc&Q2n6ZiACi2lHyb63EfNclPL-Zxf2Jd-W&Mc`84+Ut*7*?|Z_rg*> z=H;qP92lYS`xxEoB8Vmtn#|gOk<8<^_M624?(cXzsC1O*z zF?t{Y(7{pm!FO?qfu)Le>?GR>X0+KQpbk@UP8V-5sgEvWbddVM>Md{dzEd=M|72c= zpO0C?(k<;Z=rq`N?@m#>4Xz}dV0-$^+t|4ZU03zblad32RVs<1s_9p9#1!*g5fP>x zh5|w@nqA^8;&6hjqK6{7l%mE~hPM(BUD#2n38C0^Ygx6S#OYE>P$D%#u@Ni=`x1Q( z$JF&8G)K*xRM78|js~@m0B#6Lx%+jw zd+S5@P!#x1hD^TWkQI62Eccr`U7h;5ALhy~jgK$WOOI#5^qtdF-GR zpE%eRBs&812Q265vdGtwygy)mPh?!(R;fnUm4_AeKm@pX@($0anFktYzI;@WJdZwf z2{;r;sn4mUrNY(OrE@@nF{p?EV=iaK>gx5?(!nhwoE~$&P*^zFLjb6oE2Wz^Zd_l5 zlePyMP);E}4)kqTrAL}jeA^k{c&k3&Ijfd7G&Tqh9{d{~Cm4-3k{Q>4Fo!rB@SV&c z9Ls^wnb0|dBrum63y9B$$dXD9G=O$+CRi-VVFO`0a6FJVjr%FMLHV2krvSX>nNEig z%4e*-s+>`duevR-BQXVT?o~jtyh(9;In_9@@>Aj0lU>CkR-i!sXpD(>P&jx!?&E zYqyHk31E23jM8=yI1m%-70wDK)?yPL<^ni0gyGvL+<||vq_;pAtn2}ws{$m1Qg;x4 zsY*kydgyRpKZgSx0`7yD42M|`2RR(#aG1jp4o5j0=Wvq4CpkRA;ZY8!IGlc($~?)} zr$k3*FaUpK^$@HY;^ERe$lhYcJya@fRSlEY>W+a1s1jFw^Y1Zg?9`dj*`2qdoN_C{q4PkzWn|f` zkHUjoD|owxT)B+9|_&95opE@m^YHO<$ib!fa_jp zZhMJcT<l+D*&bX*={Y_8xp0r?Xf#u?=?V= z0DdhP$9IWbSnaW&KvqCWj6e`sr_iM1h#(w^vk?pB6ZwW>Lponytml9?Vzhaa8?hg} zM?^nAdxPlp+~p10#9HD=rI`;i{N z_kBCnyWjCxW>^Ex)>2@iDW&$b&a1{cME5ws1l3R^3@QyQ{Zn-`@EKp*2x&dr(5gzx z-V57;)1oT2RwwyCJ_iq53p+;ll{8KJwyqB%mY*fq$RtX_Gu(r!4X>@j&lSna3#&D8 zwNMaH<}MhClQ5hMyuY+QT24EG{AC>sm@RH>`{o|vIelKNUP1cn0%V|TJ~fR=ktbFb>gXlPToc>^N6O0P zYumoYhiIZ-^Wij+^<-ds*2@GkJt@mhpW4LkmT^WAxBGJWb3g5MkPdTOhDZ?xSH z*e0tnqzVI5GrrMEW!aT&QOk}uxB+6|Bz0Lq((+1@Q+_Y_c$NMdQadO2MD^UI$1~Yh zoE@ARC#%+ocOP1C9|WeH#MEgl6hLPizT(9PB!6$<3g0aHL;>!E9oAzTb6{@dI zzO8tt#A|T>l_s`6Np%{q`_%01)+?S@!kXl0+ujxEwjbpqjWpk?=S4#xA{k~v{yUsWHywA!r2pgE2`*Y28_7bjoDO2=8fFIe zL^28BMu#da>|V<*9w3MXG@3WCAn6kgOpeuTnqbLlgRck24$~q#Oo(IIx`H&KfzT(h zqT^R6;U;ioMdhZ|>Qr~7cJJYEFNga$+|OY*hX)T)nm)chEb0?MUBsLnD@#AIeO$X#OYxQd~Jx*ARv1` z7D}+qq}IhdbONfQ;S{Igl(6HpwRzi4U~8kpO2~+}(bmS8)Au2<-EcS605!PXc;`-0 zyNk_DB5UaN{|7cVzyR1uGHJYLp?w7{p>1w?L8(}{T+VN)1iDx9)uB8RwY8_?^Vd3A zt5yso9rPY+bLGbRSHFo`*}SQ8N69Ck)htzCZCYwovGAR3(F)+^S4)NOY$dZRuTm{? z9~uD5#m&NZx=N||EhXG;^#+*FErM@(tNn`I61EOhpX-U8l%vzT-*&!ur19>JME`gn zsM&aDy&f7%2jmdIN<9LaetuD8_cRKe6zSYckU(XC)EvZt*sx+a1%vzm6Hg=v+z$M+ zs?c&an`$f6eI|eJLVq0s7+jKRj}m?z(*|5AVJ0x7{UV3bd6IOS)W$LGfFglv%g}WO zFG8$?s$lXD!9UhWiNuF21ZyOS1S!yIrGW~~g(q5hi{Obahv3JYL$*{x0d6yJigm!Q zgAI2fYEvH8bro^oE1qn|xsho)q+%Y; zH0<_*-%DFQDAutpqj)u;HZ(ORIc&v920)VrBE~1~0xe5J5F;Dc8Vx}rQFair0ISgu zbd9;bQDKz9kK=N0Utg^{7^n97hCr>fdEd_IKDte+vzni~Q#Hy)2SY{;ROEc&2Fy@> z?(Im?Q;zq$vI|MKb~MCw3VZ~VE}Ir;bWDJ6=&r+e$s^e-uc9voYBkP#=aEysG}1?2 zNPa@(4=;k^n4*dPc&HCCB#~m&V8`c)b;BvscT#n#q*Q);<;WH37aWGXApe{N^U$mJ z7or8xKk^BP;mUo0AWpwB*1>>9o;!c;xfADS-hTzg(B2;~iH=`bT)wdc!Y~&q7e*hs z*B(=P(l@?*edtHmI4_W2kyk{OAbK;$!K%bN?E-YC^4a{7VsxRt0tdN z!68q?&1B&3qIa1rNbE8L(#(LkoB5CmV}k>x(QWDnO|!?eU~xqU&xI&?OfgyDmuI4!$=Wvq4CpbL9 z;Zc!l2?j-{FmPU_qXX0~Wce03s_Y7d04hF85^xPJnQ?sO88JmOB0wB;c6OMbX28iJ&bpxHps5;*uST*QN)r_JgG8BTE0ZoWh3*aF7d}ZZy`L=0o;tDZ(mmvU{a1WX zm7f$bD7v3b<0Ekhc_NTWDikj!2A;}N>3pGBSS^4TfYJVS<=x8lRXU_U9B~p=;3H0= zKjprx0pW&4hjK?i#xd~3ZmgdZ`+PrpiCzDyKF<1DO!nT10CuQr-Vt_yOP7Ws zl}({(l4Imi(%Xf{ymr%0yRN)Llr5EzYp<-GyVBMdQJkZ#nqRuUQmD`*NyQO#m?hA# z&Rm;ai%`X`s}k(bC4<4aA{&3Y@%`7Cj6ehXZoNN!KP(3eX5k|@XP0KKN5N|A?7bHY zrPz(K`)hi>=`GJ!?M)1DbFY-HUB9`sFn#^TtNf0oT-#-2|b}K1$&%V7~9QJcKz+qYg>wOT57|eko(-84G5OnHFeO)kyO+Nv7p^kz{ z!*LRFFq^$rf1K1qm>j*`zG3Rd*U8RL>K4A4f+isawLxlKo7Yp=NCQ$EQtIJ{N+e+K zr#1jWMZ5Qyj;XWG=&I}fAc5_rPA3~~-08uB$rZ_g-*EXkL1k6fC z?%|aj76Sy)$5YT6e}IHL-cvF?2i*n)%)Jd%zkB3i${+HV1-5(KMqVcTnTF{!ctEfL z@G;z9BW{rW{y5QjjbK{`{Bf#Zq4sq;YT<>H_t6!5?@FwdyLj~0;9A>~`jM!$yiJC` zL6enL-~%@ufR%N{xu}kyn5fJ+Q2A$d)rkuklSF~6UFa)!lmED}wQ#nFE|lB@zcWKM zEH9R%rF20WnnQdwyrc3KIKy1wj8g#5_7$sB*yl*g?|3WjbjkveVnaES3PEmkKTlka zA|))7vTdBV`PuHd-FD7g-*&Zlq;cW3#6K>!yia$@7|LYf7Kza|I4lgs-3GcH399Eo zpL;E+Cx%A0;0wdYNQ};9tZr|~H4OHm!I3nBUvadkw~}_LN@TYVsOJ=tfgqMr)jY@Lkh74@UDR<0K zDG@!kgkrnW&ivv?lta=71?|~f4@0lqgg0@gg3<)%%E2?mMZ^yAK3cX)${R#M&&@6_ z^~lX+LFQc~5$6g#3%I2K(}!+l`)uYv_w^kSL3kV*P6nOG;UDG*sMB#G0eGRT?E-ex zbi`b>O3qcosRiJ`7K^V^Pw~?fO6^;_)z@4TRty)`3O5q)0|@5*f-hUcDW-|17?*Oa z6nhyi793C2n6Miz6;_?P%1PQPx=OzB612F0z18Jbp_e1KZc^OtGb@+rCa5xB=lQHH zeDApK)Kux!mHBcnY&*R^($Mt{WZA&21JIdT$($BM_+#nuu&aV01BxtDf$ml;7IlkOnvz-JC)!9t1V(vG z!$!c7b*pGR8B>B8l0Y@bK@Ul01y9oqtm|gv?`UTXe#jSk-$nxP^%n#-$jd4dVGt4A zvrKdjvo;`bKx;7*hcWL)`VMiIzay#3U&sdv>XJAe5GOk=&3CHuJ1;NAY{b5@k&m8^DlqT-5UfA*b+~i7PQW8}54gt>0cVTW>3SJK z_M!O%MI>az0!1{SP(cOf8dT0#q}WDE)+m!*L&QmuIy?wgktRhX!DR#s4U&Kv-MlnR zU}LKm)pWk2*pbe+7uz`?bA`@pZRj4kK>Rv&GA4eEMAvY1wEzoJI4r%sGH|9qJ{m7A zmKNt0;aTHV-sb9t1q^oM0cY@%A3ZP2#MUf<=Pn+5_SCczgdS}Mj%5IRK!d+d95FOkSJr zX@a{`%Z!bvP#-uPEEtA>8-Uu$^62W@cfYju3 zCp=`4jRl7>4(m8b&QthLe zRKMqzAb9h%sqP8w`5OE%oM~cfrbnW4@NIT{+6@Q4vZW@xZJ(Yy4AsA@+UW2uN$;Io zy}s-{)mDlauS)-EL^?O$`fvkVn&62U{fg|kuliYHrKzs0_ATGOXRT4O#|q;BJV3+0 zjMXwTg|ky*F?ksPP=h+A>Khwysbd@|IDkLZkG(aTwmpAL^(uWmgcn2>tkqA=G4H+6 zo2@sBrj|VL2=`z1enf2oVOOR9{^rRlDss`6g^~b?Tk`zXsy{{h-@j%1) zK?rB6x5i%r@EXU8KXtjvSt(XIb{=S?yG-vIUV}q4 zq@ncz$=2_{SI#fHyXYNE2xz`z&s^E8$~nhprLpY_`ABo8Z@2B6PaGZ2mQHk6%Hbgp zxQ`Dy_#K(Q%^GB08Kwz$yp9Ee|y(_UPF(_UI#UR+UbJ?j|#YtL#`>&kkjW zedO`Opw2N5jpf_*A15=a0-j>^eTxe|s9B@B+6D3BU4pwVLxZpXlHlh}jRwu{{I z99ZA4H1;4>KbT+iA>=~|^&_CG9-H8BlEWuCJi_5o4yQOg#^E%F$2mN~VUEM6IXubX zX%3$`OC_J<>*vJYeK1XH6LpZ=&~`-QBZFu^MrQ@^NJF~PaSY-cy^~mM4D%S7Cf5;* zjTt8v8*3M_*aUYIi%n=ZvDk!D#9|ZKGo?h~RC`K^2@n9G{JkXlse{3WPxJ%QlmN+R zTIHFe75Yese%e{|)3E{5WR>7F_a??80I9f4|*dQ!$`B@xR98s)CEHm6t2@WBSC^jIL zIc}1O1sBe{V!!et9goB&{B7mYD-kL`fx90<`*7+JxhAE@p2wXiT>P?Bt%y6<^2v?9 zzP`hK^?j*JS}sXy-56Xx1+F3M3c-`2@cN`HEANWK;)cDtSq$AuOrY=9HmM)`1{wh= zwQmt=cd;31$*979MfO^-FT?gY-^F)fBmZ`skVxOdf41UJ`!zv!6?J%nj=gt%zDw>w z_Z9c0^9bkwb!{)&B6p&{vaM;O6d|$e0C)e{x2Nh);T8NXkXEvqFDsVrcszG?J#1%y7*=cd0^o`c9B?e@4~ z_qtmRNY6zs1IPUVq187X+qK5)mf9VRz+p*`tIyxYdACT6+hs+-gaev zr14c_W%kwWuE*e<1G+N<`lI2pt|2=PmS{LX2PV>6W;1Y{UVY2#oDbl$fT=T7s{!sI zd+0!GG&tx^!j!;efrOO+Z(b(QfDj9g3*f$B9~`uhqe!(k*i2>;0Biy)i8T+#4?0{u zK`7t2ZYU8lJtU2;s#re048MnSzi)Ftcg7(BzKj5jr~`6kf)tBv3Zwj&3Z@L4X~h&4 z1|5qGj1R&73~nSWH37-~Yy#d{R%^0jDq1MmNx5S(M*hh+!4OMatq`mAfKlTPR-9Xy zt)O$z4N@uqyh$@-liduDikrkvMnqr6Z<8<#;F;9AiJ8+N08Jf~4jm9Cy+Orc3Gdl_ zgMaN^2Tt01aKj%@Q{+Cx6=8$_)=4a1PCfvxdf;;pt+5YoIyVn-I{ejuQtiXtC+&2X z@(vF~*2=d09hk~%)P>K^LwnU=2C9*jMcGxJy81^Mq*7QiUtwMrSVnYV zwT2?tsoCpMhHAJLPXR#UfaJXYBrVbXHI&1(p02iKTG-*kz{(PjDT4VmK(ROz( z9nOw6*GQ7A-nGuu=_4xIR%HNIfA|B)u#z?ag@J0ZXBZfD6ZjJ+5zrGw=_I1o2NN(u z!@SxGvmR5&9NUgBip~)%_zx)Y*Dd;6lipxD)W&2}CtvRpR*;O=@R8DFh^ZFSqIDdJ zf#}2xc#nL)LC$CmnA(^&2%k9QjRErzW`%aTXDRIv=ZkhA%pvOrbv44xOX3bZyujOL z4~)2Z7DUlfC?3g&^5J4QO?dP)N%1+5LU9X)${FG~rZ#GwPt5Gn4i21wKl(+OeU#UJ zx_A~kIG!O?tRKn4KFPS7Z=!ZS7bd&|DB(78aJQn#niXLvMaugnNN{w_a|_Wc{-~!P zsO7c$qM8$kNV&(TZel7p@?f?38%koMZ9mb6?^M5d-tE-dPwIZ3U|P@yhsRoL_I{A> z&@;I5`QbFl=i&33!4PcXNoFblLjaBjP+9|hXBsV#WMQIeresP`R4mB!c}3J{T`bOF zJ%>&BfJjd7!mM>V7-JmcBV*w_e`6k$0cR>QG_d41W|6&!WrsHIK#>-a1|v+iNS|dG z>989iw5{_!ImaU%B6_Q6v54N4)03dy{gVEZqh4BeSBwg1io`*~H~d;@VEQ^xq+lvt zDFboi%F^RsJVA=!)>E4F>cneYF1N8lQszrP;idN`@f{?dSS)#x->Idg>o0rkgEcH5 zYSijAp!zBcXl?oFe64M$(tvHho=56k!>kv=Yr7G>o=`MsuSb%C+mjc^J)}`)f zeuX|JWFqb;32ufH(Bp;T;!2_HgC%y_r`CKBGBH`;WVt}}jKd;zb7jG)qmgJaWI_xo zr)Kw{&0=PGGg!X4?Q4FBrZQc|)@OHLVkVuIY*J+kH!vqd4Y-b30P~VmFQTup{IAk` z!O=yiO@Q_XXbu8+%eFRYj``&`Fv}oWC5zPW`FdXxoB$ZTDs|F$DfJIQi{*2V%w^$0 z?jbkvydyK(vCd;A;Vf?Nm+iehniIm)ufDqN8+eE|`v^lcx@EahClIQUT;5IMiP?W%jG5qflMM>0-mbppz@aA%p#O^HI zor1R#d}?+b4sTJSCZWR{QIpiu;q9Kc_lmQpD$lYNlLKvG=|oX>9qyjDTDr>_{4?#u zJsBcb+=M72?7Ln445M6q{A)`Y%T|60jHl`o{Jrfj&zi{0N->6|K2&a3g;iZ6SEXuS zZ%N1P+m6{s>bde`7Pf!??vyf|9`pN)C&M;vY%F~*Ue4K7MNYgjzjSk zdeY!M7QP8!AT-`%0RRDp)uv!0Q9;F0*IO*=M2ER?&!MwZxyMb5~D~`-SN@w*mvuoGDTlvaPsix)m-{)0c zR$XQGg()QYLfv*KKg3h}rr+{Y^ZYwD26H!@nv)3ydwGy4hS-}OgX>^aBEW;uz})I) z9MiFcGP6VH78(xLRFdao6AG6f5SWmGFvf&DA0UYy{6#@mNHa15xW>ciATy4j(QdcG z9TS;o+%2jlSZB0jzBcc?HgClTN!Vu1nfs^^yW?(Z6aMG*OInvgmeyS=3^a5VXXIRf z%|JTm^gp43+Ow8f|L2&=Ez7ibZ&sVhzlt+1?SkC-w%}rlJ>cs=738Tq)c&Iws&W@& zrz?|5mnSF3gR+wnbE0znF-_PGc++d_WcB9wr=5z$ z^bDD*0`IeS-6za1h3GwVeI=tv)dt`r4wz?epMwZQgT|yp3kfH++=gt?_}r_e3C~Ld zS#qx(J#%jQnJZ^b%uF4hnwcV64)-ziH2`Lk040|^!AptsNWgd{Z>+L5X~Ea(-1XIM zNWmkszN86)G4tPLy;KuLmBkfqJ;vP4#ia#}sNNrH1S~peY+v0ahME}M@ezM~%!N>c zdK?`SFSk+tU234WRGFsaQ{n+iMswfn+)^QeUX+>8Ct>cvQ+zYFh_jUEt2{otQdwTz zmO2|buRMW)XhoVXw{s#sm6hXiH&+-v8s!W$Bna&kp_J|)65mBJ)XUF4Qg>Fix>UF2 zZ-<+(t#%!;G8l=6?)_!Z&Q_zYoDZY)+VurFJhyZZY!KvKY1Pm$b^hs#XHJ}*xo~A_ zX6F2$dacBUR&@G2C-htSsi^2d*psDZ8=p?9`bP7oMA%KH=-Z4sNdZ z!4h7HtUS1c&Kfsmd0Xcc$~t}F(uGHQtSvP<^VItvXPFg`=%6NF{7zILyGbv8WTiy> z;-b$WR~Bo`Qtbn_x%8Y(mCsJi%sqehv395PiaZp6hQi7A_3jcKgOPO9=VP?!kzHCG7Y@8&Ak7)6W*6^xwrMR zr>0Msg_WDjn53n#k>pA7IYYgI#f~|)Qr#c@Sa)jqW@#<8P?%qWO-O1s)lCazcj|gE z)lD1>-F>NU;ufD@L)>br8;x08oL!=5$_#&aXV1+b8xEO^3n|LmA6<54YMw8ik~`r8kPZGzl7JWKMNu0>NE@t^_lY*PZ+tWXD^&^p&UQZ|nCg}_b*E-asRCA;!fI-N_uA@B>M8U}5oTM3?#YTi;U4LKv}uiByAdj@K^&O}0+1FOvggeJ-U>b*qb*x_{9iYbyg5g2uyrgHxGr&TQj|}1yzgf@+ z)0ts|I|`S>Sp?&m#>Hw|nZfMPV6%H?%POo7j*n;bq4CVPK0J~c(uYSgqxuLA^ZLjb z;FzQ7EP^bY6^;%8lR1_i9ciVGljdJrHq72LI~H{P-d=v9$|z+6yJ;HFT-?qwRqMQa zO!unU_t6#$v&;-AhE{@Pp~u@gIGLe+oYOiSXPPkoJP!tp#p0qvz(C8FpKv{bPn(!y zC|?PmjDNFM0!jPI!udi8%19q{TMmKybO&fhVDJouWx`RvNjt_hYH*B=>1gTX_HRKo zRkJ62;M!eO(^kX1om*8}?gIebJ3Q(`5sjtO?c2QO7H>qc&Fcl%axzhALP%!K+pEgQ zhtk^U*oZy||C;!eGMOY4d1f+51nD40-)lT&O|<~1+IB3tkX$mpB$B@MZ~W7rfUrZH-YG1C|~jS173G}R|fD{fjx!Cq}mo7xFe zJZ%~$P5qQ5@!e+d zdrYwo9KiPqGx!=X%0GgCKZ+LpJbsUv@vjK8{#S7MW&8u~SvQSe!_}|j-){&r@!P_T z{*DO#9%OmOA0X~)!fgC1AijSrf?tK)rQuIR@aKgNZ=EEWBU^E;Nl7*zT#wf$bh_I2 z1TGKv11v;_`&sfBYqEFUXSNRVCd@l zSur(qeSJ}dG1R|%4QWO-{kB+dgovD~eBUpK^)Cz2^r7Dr>%SzFq2DE8iK?`ILa3h< zKOnwed`grrKkZ$9#=HESclm?f0SPmclp!a z<(uB+&v=(V>s|hwcln3jYmm?8(JlT+lt^e8(p1*c+E)VC4zJ5eYGo5WmPou5+bMZ?0Z zk^tbH90xS0h2v1GHzhAYRj4+%G(uwMl8}I%QKHmdBB`yeyaX?vz=ba}E_?;@S=ET> z#RzF>j{8qXMo)a~@oaaplIlaNdd_p(1F|R>8Wcui2}4>rOGa zQ4GOh0FvwW8f1K-IsLWyaQu@b-W46ztM;uqW1|>` zCjqL{etFI)MyX;TqBrjlLt!qaQyc78fsmdv=d4_vO3kr9Iv0E+0p!2^v3xuiSM2Ye zGjsLA{vM=A2zy=R8Wc|Ved6w1FxLpn*0pRnRDT_k!>|>yZV6GA>Z zo*ER7-cxtahf?b;^I>}WPrzYhJq8DG-71Cs8ift|_akgHJ|*n$7nMC>*q;*UipZSt z+I%$rN7NP3xd?Rygr=>5Pb1%e`5A;A)@Ko>gP#-jr^Q^L+#ja>8A06;z_U5s@L4=g zpcutdw#t6^oY>&|ZR#!XIQ|ew91|B5@UgND19lAJ1nSX`^!{@c`IQl3Yzze;;4So{#AdvenCyMe~r>vZo1zP zM~##A?~2q(#p)sn^?;%#l{Ac2l?+Jal&oSLQU*cD3dT=3EbUgTgCGpT*GpdH{s4V| zCsF=D*k2QyG(<)S>SAdj-Poi~`ePo#fq9dj{g3(CDQr|JY}F_{qyH(wv&NqxY!Cbg zgcr?kAiQL42>VabaT~=k?iC2?|4huGM}VEh7wPo}KGAOo3`p(>e3gG8=J0rAC-RpV zS{Rk%GzFOU1}CCkz^A&2(I*q#r9{EpgiQ1{KIk_Ru_{rnSx6sl?LE#bgZ-o6fV)G6Uvv=(OBJR4wEJT3fQRMntC)eL1eO^#_MEyHq z|DD+Eo!2?z99ZQo{k3=O|LSEA>!|c;WdD24epdN=WV|B&0b#rP--P`SBLBo@-)!zl zkv~#Al6wLV^0xioMEM-h>G3QzHl{f~m2dl6}%F@fT~%`ayP@a9G3+bHbA z;{O)*e-}`nHR199ACW&+JXW0E%pDi`sp8Zp)~DXK|6jKBh#H0wVzz*PMiDRczJoz< zL;YurtJLjfox_0l1<(NbXB6Km{#n@n;ta@*;t4s_HTz#>l;#d~jb1Hw87Yi(-TpV+ z&F6}_;?wInd>5}_$Yb~-F^sM#p8hEIp!U4 zpH=a0&T${SV}DM)%TIq7Px72{I}U`vM)CREx3O;hu!^gV;`vMJoSwTt*zXix&KJ;D zJjC~jzSl8fs&Cp~R5y!zpq+X~qvqQ`j?~Ea)-8NAKMAcBUV9xu(j*f^oR}cUZO%UW ze7`J|ec%css3{dFOOetS8^G)A>uB;De_xiSA~Kx6gt!l& z@IP*R-Q0ohj@1KnSaJ{XC0BR%)b?lZDj6S1x-nTk&E2bFoRspFie^H(v4g|@y{#Om zQr3R;6gxb*4wQJFDJb39*fO%V(n{B?3Nyf91*di3$+_bV@a; zj3(|qBRgskR$*0FVs6o5g=bf;ue`c^{bs3aP;!l$FqA$qJAcj7C2kdTm}~Hs123C? zv5HUlQH`e56%TY}{(s`$1U|0oJnWsj&py}z?jQ*gTtEUC3|2}q36hXVQ=&jplw@f{ zW55{@2EYL@fFPKm3Cot(#E$IPj-5?Tyd-fFJ8=?cv)v?3nxwCZNG4LY_O*F0dCf~& zjoT(|HoO1t+&dcxf&fYVs-N)Zox7anJLjHzw(tAOmvF1RRl;JOzQsMB|LEyQA3t^c z-0>=w_>PMUy@KPC)t%AZc^(Bz25NP7#-z@AW`V?GSXg-?i27q{4ybBl^~M@3 zFKuYp>fhba+R)a}X@(g-ivJUt|B2A+vY63f_o|6eWVJadB+kWZooKxi!wlX=$Jpf9 z%3p!q=u|0x1^yjQmGW0mz00ZDBfg<)@l?(?K;uVRq?>p6*`7{s-jvL3R9)ws{Ng2{vdt<7Di8 zZyFKRD?TK)wpj+m?5JWuT=*n2Aa;#2ZFdL6+xa%j7rBKGkZ$OHKRZ|aKJl>E;p%K$ z&zRRU)`*?&%J3$0pPs=*A@0lG=LSPjk8 z9yW&RROsCg`*gNSGI4~L8lNSfXYsi=z~}jaWaF!C2ZkEu>nxgQo{q_;!?hley$M^Rd&99XDx%)AytRTJ}{gOLD>fsHB5e?lx+2 zW%()?rj!S~c4yT_bJC)rMWx_g=Qk&--{|#zme!mpro2u`NI|}%ZK+FG~)42 z*WQvcZpn)*_Lh|Ce9=(F-Z=`WO(>u;^yPmaj>pB+Z<)#bTGw#CVtvVQz9~al)R}Pi z!AqwP>G;ZI`f12u3K_MjA+`hZlYNIa@1kb92AJCA-P3(I{%AAB0F$NFKc~0ZVt@&) z*yoHk|0RPBWX87V%(mbqlNw2w#f^ob{0@0psnSZBGL#Qt<+swBe#ooF|J~tHva)hD z&Wy~z&^`o~S?nm(>HdSo=MI*Y%RzZ=V5R5o$zj{d6}Md?JG4S%)QG|LC2ysyKCsRp ziknJGmT?|jXAmV-TBI))81ZgJm|mS0nT;ESo}QBcPpnhaZjMUYJ?DxcJ+#h{%54yl5K9*6 z()SWbVHfy%YtQJ&W!Be6)9H&Mkixc{l}$C=zNjfB38LJRSjoOv$!OH7E&e^d?6+z0 zm@-h`!Uz0up>?QOHcvV2$3HW_P>T|KwhNW<}RPgldrl><{m z{qb^RS7Me3W1ZdI-NBOVG2YpeDA=IFTv1>5Z3cXjq1qK%uhmyD6TPS__OK`@u3r2N z8yga`LEfx$=)1|MD}--bJF*Vf993>qZ zw0!7ea>!S~z@UxESI**+fuSL@nt$==VHry^y>7Ivs(*UUn>frWkQ ze4FAy#dgI`#jYNG%eJk(>bQ@U6LgIIS_q3k=okmZE|3-yyFhwa>;f4Pu?u8I#V(MA zbs)cHV;v~K0^(5?hy2xpEDi-~WN}E03`VqCu|FCL)2}S8`N+3Y%->*fA>Sa&J&p3c zR9{fes!jdOLQBMaQ#r$q{`?L(qb%BcChPNi?fP31w=b)V7^X@(s=S)J*pfK&8 z!8UY$K+f>#ch9J4A~_Q%oWUk)en`&XILuAuN$CvK`cCFgk;+ivzSG<{+{%3z=D{N) zDR_c2PjU+ybp2Yz%werT4mgb9DY~-_-oIPiv@7O%jEO9r>9$wdi{y?+Wi}xIAt`>94Dp@V6E*3sL z+g7<*vLlWzB|EErOYXiVmFt6-iltp*_C6YBXIH#mw&*IM@{ms_$#zJWFkPcm@tf1$7nwk*tq1EQ1I@z2@4KY+xge$+erg# z`RrZ#?mex0756K)DIQR4SM1d4s{(#el(K4u83p@lheh$o)qm21!!&h9-LQ@EHD(3s zWh7!bw10+KStO9Dftq}sD1kC9&|H_1 zwbqE%fSr83Dc_LPTM0s(rZ=(jYbCAg%+o(@zc^}F?UMChJ7ux{i=*{wW25NAI75D) zEIn+#aXp2Xl9Y)X^`^LORo`Hl)%IKYRu$6?PVe*Llo-mRn-VmAamcOAoCZJ0TW9Z<~{-)aswTbK!G@1e54fUNfqdqMB`R{ilRJ$3rW=d`K(p( zH7MHDvGc)XL$WGU)gh3tK|S}nUxSyt*^IKU!Q9ALj<@9ExsfsTC6MkxljjUowGDCu zt()9npF8sKg%iit;}=?jD13O9wf7S6Ava*&&@E-nM_H6!((LT~-1Ph$+d;>$2)jI8 z?F+Nxb7|3|QM25^(p|w5XP+E8t)4ZQH(#~wS%*{RWw|PEdnD~%q6?kX&hB`im_j4o z(-SKt@SxmpyHYUDA>z}nH!fNyo5sgrw_0tJhN_xOQ(zFU=?p~Km*qj>K@_uhe9?@iq&bwW3SL$^dAHNx9EUn(%qG;Nug-`l0{ z*4%k7@XD2`WRk0F-O>%a`j(_cA1&;KJ}x~zSKnaO@uG>!U;3UTR$ieb(iMuYP`~1x zJ-4ga*a1vP>!r(HTQy>JyvB=7vt~qjD2>u=VI4=B7_obx6m50at7M({maL~!5};Y5 z9pDx*{=v!!x0e<$Ow)G6GEPJ)sp*Tz^eGT~2sP{%yLrO%noOJIP5JxTL_j_E%;3<| z=n$u9?v%e#95VgmEj77po~m6<_?*k45Iu^XLZL2iyeF4XrMb28Y41aoQ6YDCAYh+K zj~#zu+GmYiUOb(-z0by#ygcf&>Bi0cKx~zWRzEBG_ysM|zuUb&QxY=!}Zmji%yq45; zLa1T(IqYc4UAbL_D?%NgB{kBjvKmmYH#9YFkcKjNgny{MIE2zaB1+@RVx;bij#S0 z{ny3WpFH1nT`Z`5Rd%uEyVddgAIT56anYT;r6vEjyqWUam5dPJeF>*Ug}S~?Sq*UO zVo(i|&&wp}T`1|7nI>?fkUFkH3>Sa5ba(jfJg}Eh`y8rdxzZMeP$_9S+cjfgsd0Cq zg?6JDl2QH%c2ta@D~lSaYYYBBdHmm1{$pT;$BN(lJ>_?<^jIOHqRjahGxxvzH+i{j?%>(}G7uBy?eleBlZ~A~14%abiWrf=H3@1xu zu_Hb7QNy+`;0p;XpTSn!6K~LiWw))a0RxxAX1?Wy+dW|y*k1#2~-xbZ*Z_r8BJiN+h`|*ZSFF5Oxu?BvG18(wC-xQ<=d9up7!BU=Tz zX2tSVH=eIyn2%wQ;CbKmWax%C-wYaRH|LUFC7UB_+)J{AUc8`2k95N@u}F|j$;e^- zQkbJ{$>?G2Qi!7ldTQUS`wDM!;e{4$!^>msa0bo#9rCwh*z(d6VZ~07_ z&pn&lj{(u?$&u0Yo!?|-JIf7ppctt4R+jCj2^6obTL14NSE~Lm7gOOK=}0_%>^hg zR($TBR#D3a5M_}`A`h(;8Fi)f4$`ehxgHhQcc#mh=F5V)ZJJjUz{(x`(!h6Hu{}Fj z7RSIbSGL(%uMxVr)%x3|n~ zvw?u#tHF+jvMN_LxEVMh`Q`-ne7Ujo8k^YiPVXrd$4bwX?(Qz#SXOSguN&^F`i9#+ zRaYkQQsKL^pH-LABNx-NxuVpf-U&}+5iFaq`9b!VjN_%+yI8jOVNEIY9*Z!-9Vx~X zz92unc*>kgttmv&_72V}b?;+@Vku>9_7I5vx7w*3bQQNnhud~*ZphURS63rmWyW44 zrgrT!$Im`->YOQoDjNWIC|IF3IKJ+~Z>y#~Ggts`GBP+4$f|022{p%2Fpnif+Qn=GxXIY8Cie z_9Na?yIR(ZC`;9C8~;Kdqd(3@ks zvn-Opu|kWu>XaY*rLnZw(_N#yR5?une~77ym?*e6H2Jsqw>4~U=xB)hdm7IA*b-tn zhTp;UsugtXu;WA>e~lBUcY=+K&m8|IC$!lKZ*?L&9RE%yxZBb8Inj0}*6H}W9REhA zs@tjRbs~LExZep6II+Wy|A-SEbRtI`|8d9P>i83m|Fq*DcB;=Y_>ry5qS)APdsu`@vVxd6dzT5O!0BWGf&8! z=hg9(TC^n~y2aIpeSYFpEu zc_n+>tZQsyE|4wBGONfYWVJ2&z^g;3J?9U~(g&6!?QU-AVo{{~)r`UTQYL6Vsm5@< zNxQ8|ojk9dN0rJ@$0u#WP>Ms0H!b@y9zG)B*ZPi#Hs8_wvFox}@>Qincw8O7f61?W zO${Xj*M|byl7Gqnnk)!rf^8ca9^PP$Qf;O_DW>yr^67?pRzhv@oyD({_C)@CS*TA| zg!)vn>N*Z<-B91ALTxP%^;rqk5?@+E^+Du(*>-8HaYptc)*Yn?{ zQk2MF9je#z?|L;;J=B0w^NpcK(P>UL-MD$ONgvvv<=?H{9NNf=#CtS}&+*%q{oP6< z4lThqvPLWd`K4_Fhs@pEhZ|)AJx1Ru;%-{COusrfj*utb~KOAqSArljbTT5>Du!Pd#GDovk4WmF~V(<)JzR(6-fjQkFk z#FPVg)Pp-jM_6W_%e=sU#hZ9zb2ICxKKQ~R3suM)&^sd{^~Rw|3ImtPg;ssro0tvlW_x74TQ>GHmOX1u$%-*!vh z=+OSbdJNdb?8&G0fUc$xk2B!dD9lfZHn6!cd~EL zLIcH-&xFr^M27l-BeJf|Qjj zdFFEaD0&@U-?aF;HY$_kCOxOQ6J_sh`!RZYliBGhx_j*l+1Ux@BJDsnmpkB2!V;pq zvTn$S%0ouph5kQR4`wdcEW6s$+qs5mbM>yfwtBr6HCi4{aXQ?cIInf18YsV|IQ1Pa zKf7x6y9*I0aV!&Vp|h2U_t=eUV!FZd`*lnC<-(}1Dau)aKoGjyWLc)6LRI5s!*bq> zDPKGGKK8*f<6NWH*0WtlCZ>;^Vk(y{6o#&Em08`W%<9S((wLgCV+CBcSYncw&kegK zbaw8j1xQyVoteLKEp)Xei8&K)i5BLKu~Q@4ZmCV~@_AvO=J$EEh_;}xU8d;O2#YlwO6Nb*Rr&=S3Y#d9XfZPWUuK``*sS6Sr)rjpY;B?(b<(SI(z$9a*q?O zOtSaZ=&q9(qv3u!aW8DrL6=B5aYvU3g*oaYn{rg^RN=(kX48)5I&pWN(_3`ciMt;s z?q;PEcO1#cp0SYhWT}Qqb;!<(hnSU}xIaootDFZbntKU8oR1ts9%c7-r^9C*yetTP_ zpD9gvl!>X_JIborTUCZ-1I4ni{e|?(>r<6uelo|(=f!i`6SCd-Hjbs&DsCL7l(c4+ z`NS!6^RlweV|lJu{UY2`nU;;w%cN3XrmG6I@EPeskucHOw~`MY#@GFuSF0CZE3o=N zy{9W~bakp-eXNJNEd|?Q*qTS52iKVLm128vG!Wy9rN-mNMpQa@`&fHmIZ$?I^1gh{N?{)=g-s2q zVb}OkI(Aer_dGo#cNdOV^eZbQDDAy69lCOpv0~Yl6cqkQE&9}$*q+9WwaAB*wRCsic}?}U;+smPXCRsH%2l2> z99`vsQmm4nJKtYQncQz>7cQq~cbE07R!-LFB--Ou%LTS-8+`XKPSboE&(sYY+Sm-nPl9rfnV zGH7B+6TNK|;n)_<{%Fs+@Fujv(8NGRPPRuoSYogkKyGlXjgGa+v6LnTCOY+Pj@9g7 z(81c_X!{+l&Cw4y_Ccj6*X8IfjwsOWR?2j!(d|*1blr~r7RNXe2#C%G{dIGv9>9HO z?Uwp_V^eLr3_~}y?ApD(bsFwiW(JHR-$3VlNAGR?SPA7>aA1GUQmFa!qJiat1qE+@s9O8DdrrQ-D)}{NAK> zlI=J7{Z$N>U+uUq_N`uX&0ArOA+1kpLynK2^X-^yU|F>-(iR=WV+qz8I?~$i=ckOS zpG3yxwIi4eQslN)5%S~l>fzj z&sWoH*n8ghBGwKsZOq5`VpCBpTSlVzIm*{2H)J+2f<-k*w)Yz-M|R|!&ij%ZGaGq? zD^`FjVs?(zau&+Xm~rGZlMFS62$pi&ee@Yih~w zN*ZOoX*UfO+3;F&Bi_}C)s4?aqmtI{VnMeSI&Sh-$T z#i0`dC3m4p3*n%Ccs>jcqe(LE9Lnn@(I(9*va|AA2n3lzb3l|DnHfwNfEJ<5w zDWNhg)RJlycEK>0biY(zc;#+#)SVbE++A895S3ARw)J+oUM8oqu6BjViIpaDBF7dl zk4%k^y4@6Oh97CR!q7d;&>zQg`#jqV)LeS_qI;+M;q`a@|Awjbas4t?u56mCzqbxFy>aJ^x5TCB0N({bT$2Py5%cAx%^6PA zS}t0+?EY4rb+3G+NNu;G%4mbiF%9@V!phA#jUSQyDNEBcf}h>v1B4ei~lmPa7P5UuKd)Aw2PI*E6rdE ztMqOPih~?R8(}%^<#Vx4emsm{lky6vPO?L%;$+0T(+yDl;uiOpxFafr$d~Ez8Me%9 zFGxhCt8kU5sMTJgxbsO-mR$K(LNDIxxktaV+*H+$Fgh*@FvsK=;Yi_@&Q+sn!d8}a z=?y423c2$DR;kLDkMK&vsIp<58ia-@mO{=Gw{173XUCtX&J1vKF@;_cdMcz!4O42W zUkX7Ey4MogEj2&J@30Chy{G{El(n z(tN~N!*kJw0IeFjiVDIV`|VIDV}{RQ=8TJZhGsHhmWgog>vK+ zmKSW6R!R0h`U^Yg@FrIjV33-2D$6?1g^s}E*fuyj%8OkyL}-NqkzGQgbM-5FU-!!+ zk1?9}KbBr_8(wKy3XcZQsFD2n?D)l+DRvW$7n3UownUwN!T)%6TE#kWN4XVWmE|qs zIv!o#B>LHe#|Es+bHQo(w5ql{ERrgSO&j+#QHq|z!sX&A39!>&kY%*^Wl&X1NojC# zE*(00`mwV(-8p*h^qHWNw%UP356oSE6hTF&)RfC{=5265cJa=yLqRBIO?p(S{|TH} zPo~FsW4u`$^+7&O6D-VHo!zK{TAgvWyqP`S{T+47 zzPai>H?hgr>2;)(3@X0HMpuF;5=<3|ADNzLrIeUY>SL}OMfqSu7!|#+|FjGm>?u*0 z$G8QX378x*(N0o^l2`$@YA~%Qb3xi>ao3`66~i2Qvl!;UU5h*OqcQWNrhOQ9vjib3~nDPf2H{DB)<#3t==6A1-~4-tTD2dyD>%qaSnh;|>!e`ooU)h@+o!oW~sJ zaYr9^^fQir*3r*7`V)@+q@zFWI7!EN&T-!E=qbm-P0N_0UvjK*M}LQ7O*s0bqm!e{ zj-GY&X~$BITlAcx&pCRnqt83~^NzmY=r1_>HHT>zN5^H0j>{JPJ^a0wznA!XAAj%X z?*sgO4}Txw@1y*EFMl87@8kS^AAg_V@B8_~)rAV(IY5 zONT#EI{eAf;g?E>KUF&X>C)lPln%dKI{ZrM@aIa0KVLfhh0@_KmJWYO(4q2}WM`YJx zqzNni7){k#3{GKr%E#hx3M*Bb7S$$X@-G(SUcSI8*o)gZtR;(v15MJfZkU@d*+TuL`xkD%r9K z>UBoNym;7r6*tFC)+TJv+Z~vN5sf<*eF%5Sd>wNzq3btqoD3ODA@d zBOFJxk!XG!KVtkbSY~6QuWkDPJwU?0D{}ZsvN}_psd07q+?1Y-*+aE#`PEGp4x@o7e7BY`d%CjRP7bpFL+?yDf!H| za=Vq>By4U?S((jZ7dEqXXp^lX*cC@}@%J$a6Y%@<`@C?rsc;@IhJ&c`ZG>PmQzjwt zFJakUSlbI>9Z;8cc(?2*yJctLmVFZ47rp4%Fi4_XG%1CACl5QBT|>JOMBF`2IVy>X zl*vS#5vVq;Kes5tUbhG-J->K#33z^NGO=yjwmY2IcG9tJ z-MO#by?61$cX#`br{CvP9rSrVr>eRPHOTs&fzS;8tPmX%NiTpqrc5jPitzVl+Ne{A zEtPVWO0E{3N^yZ!r9dlBo{V^_MxZ^nxEo?T#bQ|*X(3mc0zJ9v>loLT57h^HV2!L9 ze>O?E@>1(4Z`AkbG2{393tV%SBy4N=-ATkI>DCgA1%+W0i=JUu<%(yNu)-0%QQqwV zipHF>WBeqIHMLk4Ea@+@z+4=7lFg~8fGiI|ELh+h+?lB%(FarDLD8<&j{u2bMpm}w zR9=M{VQcpnryK1;uE9M+7aFn_ki5UWs|xyR@*gB!N;U?ZT{?pN(qIBnju&Ec!5; zu<%ug2+a;>lzAe3WD01k^P2Uo*v4$q;t9btAtT?j#wJlgk!NXq(Jn*JGo&4BJi3SEgi+&N(B5Q=WU`YD zvtorDg)#-^G@<2sGcp*>fs96nK@P1?KKAt#RQVc%iU3(=qaf)gwc<1OO<*NM7e#Zu z6Te{miRX+1#rsCCenD$d06n|^Av#}%*@35LlgBKq?dgO)bdlBVfVW8CgP8Vq(lu8S z2Uee`7O|~Ch*#`T=_;2+U{mmrSL)E)sVwyd`u*$r#O<|oRu6;DwLWb-a+1e1+|F#8@{MiP^vv3{x_}O#hF)ye&=Oh*E3D*

9aANA1J6HHwH0$b~*bKI2@Alq?uS{zp?GIHpfA0<6_9WZgR=}B_( z!lNsQe6I5eP+)9$?-RE7(4Y3)UZH-LMH)6F+yI1k= zITW$gwU~Y`tWC^*H7reNXZitv12kxdhs} zVphT)7t>p3sNKAc+PeqYtJ#1GAiEnW$yowu>Z(k+d`N6CAuHb}zV+}XS z?2o@f-C|KV;q3y%*MlEbKQpiKebM9HI1zfpyApW&n#+?P`jAceJbKw45iQQOKe(-Y z^8Hf#-oyzT4CSP66nr_Jo%6x{-N4de&wriEQ3en;J>u1oLbuT+3tAT?-cz*4|5Mjt zbHy?wy7Cb6PB@@O^Qr91Uz{S0A{2OR{6!pj#OohMb434b4P z(`L@jHbTE;a4E=0zw^1zyx0YHb3f5a;LENTz;-Ex>=t*}-tbaG$(GA5uC{EO>>e;G zeTxE84Jwd!5kSdqDAn%zG}+!C>~5*6i(0?rh)`y@RSfXh?E2`)5N_vIZEd_RDwzps zW~5g)pueV4JHl%XL;35?K8u?{`3%IrR^zXVNI&}0yw(^G@j^*$yI3T>It;usKWa}b zZVSHKbUSXPUz%So-n~}4LGX)SoS+bIPx|;vz5w##ug4W)!Eb=MH?c`=FX{I9!q=Mi zbYl;S=BGAjG#^;(t{g@V=PtXKsR;wy7j3~{@IJEeh4@S`ppNW1m^~i=a9L{@F9M{nbErR8;ZUDDX~e` zth&VtfJvM?19jRFy)TqC~k(!tA-AE7cm*2i8#LEsFes2F9CXwmHfh`8-Nz zL($qo#w2L?(X*HKie2tFDO*agJjD%IU4kD16RP!Olc$QDhh1`se zd!}4DQ1a%fzP^D-%*G48sOz%a$_Fdu#m!ss}=CVjfbsyzDE#Q?z_-pKkzGnk#>-|Xeg9O)Xv7KH4)ay&`R#+_aCaug_YuNMx^M^$G0 zl6rE(x{=~TY2Jk!u{FA0s%>BR2F}hr9zDZ%Y3R!aRz4mZ{2^3~mPBjvFOPonw&! zZTj*>v)Z=K7udokv+L2KGTa_}r)OokoF`N-tXAZj(NwhT^=v|A=Lk7Rd>oTLLXtlY zDL!J!KBl$b^NU|aZJwgLuJPVt>wY*oE4?09Jfc)T&MRM0%3qbYgH&Y)syD&_UMN6{ z8RTj)$qoYQtFVTC%D>srMlm}o6O&XG)@Y-cnNf~SstRjxR4yni|9_@D0_xDP1|o`? zxRSrwaCG7F0<0*yMZ+foMH@s1luf5KRlZdclHrM`W1uHC3rDH2BmmC4a^Cw3Dy(F( zjM2jC&hwqCQRadYQRcivMQOq_(I2?UQlp2B(?k`hE}|mrrS&bX=QT!MA~&z^^M{AL zGg=8Z6wT{@H7gIz$40qIUe_r_@x!5%d0^jH)zGjfe=GZTEQj@wB!2e`>ck-=Ni%c!dZ-Ed;btKh-+2>jhf|<{bp6dt$cSluDymN)Jqzi9y0@>#} z4}$B@j+1S8$J50gi*It(JnPNp!Oyox?|-~(q+Fa`S1pyQZKaj->iq{f7C+QTqX+&x zGX~ohKGe{niT^zP2HXDhutwiieAMFNo@jpxWe>IDHzBLlbP={6nlj!zSqW*mKml9vyEyl4mf?ohm zXjsjmv9uRn)X*9WEZ!Oes2^vw|BN%um2s&ACOOJWwk-f8FK)maV$>_`V5OUGY#p2yCk z&SmP`%Zq6>*tw96@ax-)ft#mCx@fwxdHJKKNZ)EY*{qp7+C7ksZG3EaSHEyRkG<1O zEsBc0b#}g;qDDLnCG~G)(S%oN(554CzHqQb)#oDK-#N&t<^_8NLgxi@7Z_$`7OHS< zY$CaI#70bK9u88fu`ay2e_y&gIXPzGd|?lBiFtK3!8`0_G~}9Ij7;UtI|vt?LI(?2 zzp~Z?;K|=R4u*C$*Ef?Yv9xth8~V+9t=Gxd0eLq}1~|VCgt<5m8;|HT@ksc&yX%># z@-BSg>iUYT|k{PuCGHu7cS2C}RY8teAP->HCUI7dKS-x;?iW9YPWNIgR zV$alAtZ-u2pfl(?MZXEMDx6!Ea2u(W;Y>Qs`Qc-6fb&K^=)Ry=C<5G4JI(5tSpJ9x z0{1WQ=qoP4xG%x9FOsDL+yNim(}nL~Z$m#f<0TOg4&S~YL{hKB<&_&fM&W& zdVpQ9P-cozp2@qmV+w;^E+u$7O)sOYNADT79h+UF8=>Sr+YvTxwiH-oSvTXTvJ>Ev zCSDGOv#oN=ZksnoX#0J8s-Cn70F4kOt((qz5JI&H*XAjXKMO+G~eS^ItOZcU1&aSBsa7rp5J?IIX43V<$xy$gzyV6tYH@v?nT={MISaKXj7^v7`>Ei@->Y2vFGI(ZUeODV?WA6t z9>t=(WmYX`eO=M(Pe;j(kkXeX%|28E)wq` zp9oj(IU$cP zb$g(H4QTSPvU~JC)**O`TWI@j>dEV1bM@NLWKv20)MZ~S@1?%lzCYy2>vB>1R?%d0 zcJ<`_?k)7FZ1usBcl!o<3%x;WXu9h^ekpuGIa_S_auT-mK>0ws4_JV&qP5CL6lr~EDJ-p6d9&qtNx^=)PwF99Avjk7_9vq6RPu6J}9 zEfHLu2oIpedAB>dl$8kf(cpNkpV`h%hX3$7y5voO|G1dh_W9#mJhKh>)5@ON{?O!j z9sScvg#U0jy8QSvRQl-BMl$%L(D4x<8ElgPe^c0J^T(=rbP4=3kLc0m#h-}*9Ix4h zeILpkufa3hynoECj*ql|9FyUJiX2)q;dk5Xg?(s}!58E>UCoY<3P+b-g?$gn@Vq4! zq%U8<0M(O=s*GBbGMy{iK^)TMSk@JyS2iuB{EV1EtW4(nG3Y0Cn8Bp=nvKs3+g=_GLEL>W59W~`!K?RX(l0>> zr;Afwv$!H3HamnM1n>BtG+V6ceNly0wLx!9P4l?F$0k@z*bW!d-uiNVo4Dz);mtYy z`eI|67@4r)EU34))r3~(*)u{c+8+?`EN3-VgH{ntJ>X$ou;=b^vCl0R?=umrZ(cZq z+Bq7V9&KHcopUT&NON(dU>}?<&d&O-;41}rD|mNjIog9?+#6gCTPVt$goDcsGzeI< z6bqeH;TBaaxaa$vm^G>wiZc_=w7uTCz*pPf70gf%yUZfie`^~w*H3PlkNKBTPWURZ^-9vEoGSjOz#OB96|5X09+yo6nUzP35(N&6@{kfta>p z2z8ZfU$=KU51!?s?`KY)^FXqHjmmxYILC(EPL3s(w5m^b1gn&({?nu_SV1{6=>>tv{k8iY{Rh|l# zw|So2z$fF?e5+_U?i`1YrW0)L5^8QCi8LG3sLEIP>D)@Pr;mSwQ4ek|*b;;!`ZQa^J)eqS!X1%FhJ)KTyTYUxM6Z`0-~ z>4kJm#5eoLHG^&Tur?GkU$SIoPoj4|MV%ZpVhQ>eoZorAitN{%qDO^|s1Ud{oVCV_ zA}LfKa@msKBo!JM=JFb`Y+`fJBz4JeGmoL?@@@saci-`^@#%lxpc`|S;XTX};kH-u zxO|S}r~hnJk1@U0KM=eYULqZ3j$g?eu(6v1KH6o{x7I^#V`t+QzV>;B1D$ar54IBy zbM0u5Cb2b{6QSJ&H;I#91IhprofW~uc^gs~jLBDBsNNqcss#Z%7K-m*Og#Zk{T>uX z2w^hXQ&(8Vw3BdclW-#r_?7t1aqFp{-V|CG0O3mJ@Vi^fYF&G#QB>W;wM{XCc)m;wV2`IQk925Vov7u&uMJC2V3zxwI&usKS0 zmrm)%&l+@Z!vRx;*d970Wl@75x6lxo7NpFWkiW5EU7oL~0=o3D zRYEdrBuz?=bON5twG@40$eZGflqZ{Ix!fLG=iHr3&gv z{Mv%a?Y1hWSldH3y`Z9uwSOb@qQbh;EYa}yHwLLnux0*3E4p-g^zvg&nI~wB+?ad`;c+WG$#)h!Enq#IEs&{qg3GaRG`1ig*4_ zL=J+2`Fh^`aqOog4r+1G|My~bw?LCn(HZ$yd@+8-NBeZcUxWBLT+f#HbCpO>BRYO+ zjG;grv^WV->SdqC+a>1rbaV6y(pD_2bl4jcqE?f&-K^MMzrUl&ZhdsEP~UQSTWUx# z8lu*iU4gi7;(y@sPsU=jkZ~-ttNCSUW4@xB0wfz&p&5YeFI*~t{0qBUjxiLBgA->V z`WN6WW6shR1u07VM-utm1Vsit!HK`Ks~#T^J^gc?fyE(+^AJ77>3L znfK{_UtX%Si`RQ^GTeb?#gY|c`3om+_$3Zbj0Jz$_uqlH*6L+H2V?vS8`*tOv-OH) z3Xpc0{lfU5!w~8(2*MeE`IjM79FEw3fb1!jEPzXqLOLXCT%}cdGy1+oTqWtcB{%u< zXEU4#4Ba*G@2Dwt{0m@=-Z9^NpYYYb{u-cbK?YOJ-_n4Mp%!bxU-mQn7WbbZdxnME z4J}pD3U^KDKCRi3dF%s!*<)mULotp!W}znq?6)+X-Y;@2LmavtsMb#@2!4TxYOwy4 zNVd!{RRf=v{S6V~xW(@A{|jstH;&7$E0ZW{LbAq>pJ_H@>;uGEvYqQg&ywWf{>w4Q zz;^!Ut7R!r2R%$elpgapp!ZKX&E=JxDs6?cCgAL1X~8n~L9y(Wp1$5J?)*0c?0>pWsa}H-CPi_PPQz2i`2pW1<9_)SPIs`4YLsa zJ@64)y&vN?KO$ebMpteM7(qAVdBUY(<-`#y^ln%tiH_ zg%~_cp#GL5h&s@+)2%R9`trABiHN28|4)h!8_|xh9}Edf=pRG(qy=YIyGd?=GyFLp zRV8&hdUdE8O^bdjzCPGLS3f>#h#J2BuMh}=e+qy(XPp*=UhziQb0IDd=QHCDGLTz4 zWma>z>)(wA@>KcS{~Gxa5rnu9ulV}EApHgK5wLK3@j_BCU)24kztY~GcvTi+){in9 z5(53t!-Q`NzP?`wGyzG-UxKaV25rIzakbKQ|8~U1t_ALhWMM6GRV{KPw12L*Pj>wM z5J+f3T8MuYd^A=w+iV0R8{yAIEMFc@jXG%bv7822DD?l1D*nUkVhLHo*Y^*BBlzn8 zSkMr?$iGzZfYd|+tZsOXp@lrsw1L{mK!0UHo{&d;kbejQ!G8zdE1C{KUMTwJ7hAaf zuDYAv`;ShXWrsN*l>`~Gi8v_c(- zR|5Yd=mjjS&~%au$l#z`3XWw$t)^BZ(?_@KG=}Exv|mXnHutfQ`NHh69oAeRBav7@)Hykf<^E@hV8{h{|ndIfGl%7 zu8^f^XTvU;exB_xFM)pef1U;TP7!Mb`{9u|h5k1HENztS2AE0lGcZzJwoN z{z9_W_x=6U=^$}! z)`}`!%}VgE`DT(A#y6bLwHK~&n%ZB=AMJDox{n)LV$FS+I5}c7`_Y$ouIqJm?_wE9 zYlv^kTm6qye;G}7K>t>=GZ!|8R~8{Ey6QhJYw54MA_$(OGO}&ZA?|d&Kr}w7s}E1# zRY|P(Z{F>06b~*RY&AF_Aj4Kg`V|?oHRSSeMA?FQzO5Px5M<`85B{W={v~R?H8RLa$G0m#%bAS;=*sy*&_2( zxRmMmT5~{MFz}i0)LpI-ZCbguD!95}^%ur!{S=274FM}PIBwLOM;zsD#4y^(7}c?A z9#>P@`c?0e5YDI_rPshQh&DKN zh+r8sbvcC}WZz{&;F!?FJ_yOja~d-sL)9HvLW>eQ;mrxOL)0}WX{&M@-pHwi&>LRB zQg_tu&0`xCylC9^epmxzZyt8B6+hK}5y<2y(rZKU_~C)_^5X>sPtH^9ss^-W=VmU3 z!&_msxjl%W-pzBmI)*mEej2VzieaMPRpN6)W*&lBxN-;732t)2s7GYSf5R80CYFlEO8qaPxW@_&-PK6b7JUGWrR--5m8$jwe<0diy<`()ze49 zv91zj9C7rV1e{q~|0RWbsYH60R03fUV55Qn6uICq*px#su_+0b4(-YgJ}AsLdD-8b z(qO8Q2Mp0B2$;6eK;Eo_Q=xvpl$o)~P1Uy{^0l!3v`F-}XsdU7e1|0{od=ql)HN<LE{#cUaqYhDv#O@`o>|Q9}oO=AaS3dcYbh~)d_}E=n1w4Gp6Wb;< zIY5ryJ+ao3N)>I8T?l#BcpFd0z?P0kd0J_)QU(TjkgeM6VcAFoQp_QZdvpR7?%fX( zypHZ~=Ne4fvKG7cX^4t+%voy$Dd>pyo#-YD2BUyEk%8wy zY&il{EHEa@Y04hkI?Z!;tcA!eNG;doN}nw&Q{jp>&AvX-B^k4E2wAZlqU+gp9RWZ% z{o?#W(V#h*ej6O<)`5uwXS4y__-Nnr@V)XXv`)X$2jDnnLiNrKW#Y=gRkWOG0%P)O zG5rTO4}-dEwM&ZP^0FftYbNgA=_BVXTBF?=j?46Zso$6u&u*Y>*1YXtk}93U^2B&? zQ9b)4c+2F7bX0WFg;vtN={}p2Pd_!KtriW0Q}evLYAJ(*}wrFwkkpkk^fh&j?GE0#%f>U@+ zd2lTaa?%3+`SRqCWZ>9@{i6I8bD`k#vs1fw~`9PFIN*-bx?`&EbpqCYX>=5EkF7B!Ff_iYiU*61?Jl(r}K$T`S8&Ib+~p-x;Wi*dK#0<$5p2+)dC|9=F%IH!;YIM=nY;t;CIS0`+y)|Knxct}T zgdIdWz<|x??1td7Lwx%WB5%)`G3pijA-uHRJK$C3MNEsv)51ze*L)XdHtr4_lWpw@ zqd}KOwy?>D$zn23Z_;8n?siy5*}yN0z|nG&kJLrD7~+S)(PPYYiJaHA@E2Qpy`^?Ek@KQN;YHJ43d*WK8jkP)gw0^KB?~3z*_ybF>_8_L7bh3J5X1$c+M3mQv4}SQL~7qbJz~$1}dEIXHl*GEW*h; z;2W`*ZlhDHfc77;4hxW8JNwd_Kbpx|E)p22k6qEK`t~IK=cD^5d~+h68)G7#jVg4_ z^)MD^BMXZat}_bK7a)T$e;$>lbRqg9iQFLVF^RK7CA0gYvuYkBf8(&u#N$YDh=Vn-Z1B5c?64)>Gh z)23&__u4SUCs9|%fClR&bfqdAEtgrSMV8^wT5TWHM3tax(-Px!8*WVw!8eWVSX8Oc z!M0T@ExQq8nG%c`I_4=CF`UO<+sgt$^PjuxppO%=q*pVWqLM(#!V;HZS9Fx#RD*PT6um~#TScY zg7|gV{>3bahxax2nZt?S9w!hMvKWf(ClaY1A8iWGD#E$HA;A{B6R>hK3Q5o~DZ|{D z!lOx_oSlA+V4?q|Oysp*EaJ;W!p)AqcpJ(48= zTyf==79vJDJPeCcq;#x{9pwgRw3UnRP;Raiw(?a;1m% z^Ql+jI?Hva%Q&8#iVP0%6Z45c#V5K@GJ?<7$H$9leqQu#&6Q(S zo$NGs%Pp#>OTyxKbL0F;gx*RUkD<1*z{R3ebKo8tzm-AaNm)O1v@0_tk-U`IK6Zm6 zTXlN)1jJm<0ZcxcX_5DntT)PXz;PAherJ~-m~5Wxxx%;4Rs=(z1tnDq$TJi{_^Yag z1=MK#WEJu5VuK#&qw7KOyQ66dl|f&FaSGJCroe^`8j{8b4=06z7LJu=!-k}`gzsfT z4agxQ5+SMUwabGe^)u|EDBx8))HTtneA(<0BelyA8P?u`-(2%+I7>^cZ4Ep~88b8wV&o?u z;^my3f!5uxpzbg}QG8sri{dYyPH8#ZMjx8nV zK@y}BM4gZewUD*`FoKnSTfWUn7{m^+5CRs~p^d~rb!%i+tRpIM6=^eO2|L=!DVA59cwZ#N1jq0Ju+3yta8{p^Za9Gk$G!Dw@SS^ z%n|Q=_o+)*tSoA_ojG`{`9%yP!i^I{L3VSp4_z`FrUX{3k;oX+7HFX6WjhLR^~!_N z+otaV=W#uJ^X;+oI}qy1<16ovH#(YVhWvg1NAA!~#z(IoK-sMavsa$rO|;7w21aw> z?~advKE*v=zMJgFH%#C-q!49?a+sm*Mkk|*Sdr-Jz>nth8lCZE{dlOFan%-01_GrSSg-9D{f zJM?+n0?yO8eN7`{`esKw1ZVa5g&}oi>#MPRKEhT(&7NS)K6FzzkyP>zkFeL;;^EC( zy=&HfPtSrn#q-tXmAq;t9b3dxBw>CS#2Mr*TxyW*-2 zwceGreh(N4Xps!;wX}4Q(a?sDLff&E(`=$7Uxbc64D4<8??HjC1?`?K-ZFXPl+wB$t|xUTHcg2K>rqa?(pP+vx~}A-jG#ZhULXDhfMHv zLYE!25OM8SEfW;pMRn;-x=|`Nd0NeQ(4|GZHKPr|>9ci3=rEYI(?&Ye(S3OVgCe#Y=;fA4m!{ zRO;!;A=J){#7mQRcrG1_ieUaq&3?MNkW-zc3i%hyBD-t>WyQX;c6;v5{{ct-&qupG`Z?T z&y6LGX%bTFR^E6N1X>=wGS3iP{&7ZKDgh8u2buNYnn7EzE{IiH1~!XojHtLTidj|c zjNqDKeA8(a(U{<%bT4p5EmI?`)ZH$Rn~^|mZ4*7#oi1M#<45(7j-DF^?QtuF5Pt%Z z*Vaf?vsHlCH6jkGdC41&lw!aS9NvEOo$n6#{c9QW=es)}B!%s_(5|M`blYcPWN!^p zWcxAZYDZ?>mO6Wl@iKKd5W3l#)GZdDoIZPUNOt|aw$fymzh+maF34B{-`S#Den?ZD|df>sw zhYEilJN{xQ#yv?~dSHJnJ#wyx>k)ffW62}oCVe}}h_{m(wrJ4xyEOYog4%R5#yW#fkyPPZ!u!)ct=pctRqv)|05Ex+cO}55?kj5%noI%eAKVTA z_+}yXGx0ajIOleq1u*wpv@%wsIHqB)zRbc40a-_g5*`8~DVr6!J zHDL~>V+STI*Oz;r)3tjYk!!q4%1JE5>VoxR``3d)*(n#LW3?L|LT5JV9z9+qgKu;F zMH0+VTjOZ6+ynxd8L!d64xaQAh7p@?SG?FN<9_?$iZM@#E@Wk~-FJaeToCmtId?(I zg(AsVuv_g-se3ge-nJ2s`F!)ZX9U>+Sxxih_u~Wvwaja8Bd92@;%LI`N>PaJ3?h5z`Y(*eP=>i?t|!9^mPdg z(j9$RnyfrZ$TN8Kby$h4LPBz0N60f%bQzj_c5cbu59R2RN%EsZ9cC1xrzM_oPZjaO z=)OALKDP`(}e>bgr(hlU2-prp!kwh{Id1MWH{28_e zJK|OlCKo-GeTjP<=k3=M#c!uu|AZ&Ryjk?jF8_wCq{%mLsQ9*$_uQ!e9#qnl0wgXo zPCx!3-w9h*nWLer_%@yQoUi|$TGEu}^Rq0FW&Q(kev_{ePAS~745+E(qdL|BQ)aav zNl~IWRHeb{>nAaxC zd_h=tw*My7I9KFOD$o733@69Dz7)5v1Xp4F0cjroMlVmpSdm*o=>kd_uOw+z39q4q zrzA}lQ91jGNWO7ZN%s4EFn{BBB}&V(Xmuq##c^50d6}Ddp+@B1LwDw^gW}NRdUJQx z7v8$acJz%7c+TUSA9uoG&p{|C1zO^ehm5`W!pWj&inJElVIx{QvidDqbUH-NRvW91+;{%U&5n9sMFFF`0d9d?X#loo8E5#tG_F@mx6A)DhD_%~ZQ?l~XZ z`HC#EBSH<61evp^-HFmDy_F+z^E9TOp|$cdZ|To%SqNq41S&2A12&9SZ{s)6aI@ShK^96L?_X z^5z_Z4Q4io${E?K>4(p^~bS7 zZ)^@SG;xBdiR!>DsWR_uU*m>`7_y7GD|sT{r?fFS`q*5@UMIvWTt74|lc76w*2iRt zOGP5-Lp=NDw07pT%Dr>!%eYS6DP6H%wwxk{uV0EU^Z2a9#mUp4o&(J#An-6h_si)9 zRL~_z9j+^I9#+N{)~#1)6BBx3+GgxIzkOmMl`~ncZ18~Bg*a2*zff8Af-?Q-#}zy4 zig>Xw>g@p5DcOWwvw6!0kB<6sNn-@(4(CXORNaH56s7Z}PX>|vRfmDJI?lA7RQ(((E zxxamNg{d1=1>Mt=p^uq3#)XyS73?|{Z2(9;(bZ7dxKWPl#vnKCw{bkb!TwR6hRG;h zP>~FO6@tMa4LxBDXawCjc)B(gHrvlI=G1PSpC(Otz?9|?#j!tkoq?}BJi(vl7FDM? z{96~ffQs-?7<2t2XaGs@`{yKSaEWd-XI4IXggW_&ZKUL~7R!65ZVJmYjGHnV1qb9p zr6anCfKG-fSBx6NY)koT^JFT2FW*B9bX4_m{2A2(Y)OKZG%MpS6Hh|a*4nW2SQ%rH6yW%W<<8+g&Uj zl^p^Rog0l_n~W)+#E6(ZO%p5g<0v!8gBFQYlFGo{?uR~Zu0sgfym_g_z#K{;@ z!N>wMjB9~>Ka(+_2RN)+$HbVBlnFzHiZS5=LFP=D$G7Z&A;vH`vRGHdXMN}uXD~DT zoCQW%McqQuU2$-lUe%67759c6KNY*sT;!!sIIoOVDiw3+Fj2c;n*KW z%V~Tq_yg|or|37{9cz{TOV7eURxhoA8l>-Z|7|FfN-ha zJy%}qe8!|89)D|3ty>D0)-4RqW{|LF%}ihjx{cTIFqbnsTW8L}P5nS(=MKX;RuMOY9#2bBFl=6PF>%r|nB@K5Kl41DtwAjhH~SQ}s13dz3Hu?#sQ zA@7xF-xOefa;nR+RKF1_`^ zwNRh#F}%?Jd9ham$}3q{5DZFawdk2oWdHb6TJqSY+{~4w6-!Ln7sw$QagG53WJ5^r z!5L;O3nB@JFzE(S>G;Cq)F*~Qs3bX$2c|cK%yCm18o72N z9Z(<++|i@hxD8Mp<=ot%m!%Pk&`i)ApfnrZpnfPxpU&eps{l6wc&Cgd^ZDZVR3Udcax?jv5ce%UkOEnV$Tdkv~%GIz3e1l}6S zs3*vmAj)^RfOn@U(kx8x$-s9Mj}{x%x~{z4!e1=8*t(J_#u2}=gmYIwPh3)|ksqw? z&FPt7(%hqUe)rh?YWU`glW0m+B*ek_%`;YaY|9ggb}4bMK(q2Wl=Cx9VXxhW?`)nO zIDG4d=4V`C!j@Q=F3T_|J`0%pUJm$+5IqHA)x`zy7R|wR_BE@mbFHFdozps$N~mnu z{UcIgb5D_&@9#Z=^dZ5Yqw>Sp@#?veOEoa0zt-)dbReg_9YtD0b_ZnZJDRE`3#br{ zYG`_()O$8d)q6pBL7QSy3AbU6F@yP?b!R|K5d88qd(;OX|J{(bP`4tIXw0ZjdCjWK z7}=2giNntfA7C2{ETt&vPlrLOGvj;_d|M1V<8;q;A1&|O*OX2LU70N+~bobT8GoO)kM7d?a!xmqO4%V1VIq zCL3ry1q=~Lb2fu1Q!2&=puiLcN0m#>axi5kkEfV|M+&AHlMNh_+3-!ii>5y~_j-6U z7`eE2mYaehgGc&+(pu=)DO*0s2%ls# zIV+-~m(Pi72cbbgI*}t&Cd~S2kyhcuZV+2nJvqmB$}>aPwBR(SIFsq@T#7SnOQASg z1m$;?GhD3Mw0v3g!{|Bbe8-&Q549<*Mvi%^5-( z=MZ{PK;MCp;p=m=ZW}nZNUm{)Be458u7n5KtO2I?OkDZXCoaN?&N;Y#Ndo+vYv)3k z7|!X5kYjL8e$Fyy@tmjT(CE$>14gJEi+o+uBxn9m74j`)pk*8po>CN1SRv#>vmKBF z_M!qEN|{+AIl7QSp{FBiIqL^52ya5>v5$#L>i=aDd7%#_3UAo59c; z8lB-(=Je;!k1goP$|Zf|MoBxJF+YWG?}jEjCwBT26o_(XkQL{j&)qqcu{iiH+=k}t z@JRDNys^Msx9u$)86F&Pi8L8Q7#|}o!Q#j+h2iAXVb-0;GZrUBv!2Q59B0-Aa5ne3 z%m_1srkwuht@E2%XD^OzJUO6IWzYx=m>rgP)^7#JzQ_!CY{Ke2`^H8_@V>cLF>}OL z6@ZM%+!jDY0S3-0X4Y@BQ!|YNAkGXWcXkXtnozi`4@Zxj^{PSf0wEikw+mDM zh=9r6JlhXIAszOwK!6$;L}shRoMTD0Vx{VL1?U4A5^HoMR%!=x>kba?9|SJ9tJ7xK z`#F=1trhDBIiKQCekJt;*{3Lq#N(m55`2M&l95N>(YL*KP2apN!_DrZEr4HZnl!-1 z?dwf$DjO__nG$WKc&aYCiZzAdCdO-Tp>xji$p?qF07o-4P^33J8LNlZpL>=?yVnLZ zs-Q+)n<)%OfyZ;L`$^1zszZHwvyo ztdA`5(&8pvW>JFcNxH!SZH%Gw$oI4nQr0_V2wB2g6&Z({lpGky40NCSL&jw5s=qBU za~{1ty)G8GU)j_G&SPYY&JdeNS5=Fm8*V)J4sd7ho{}vH!1J!~j_F(4^RAo7X-eG$ zYUO#??KED|dDl(kmlNB@VI)My$$ubA0<_!FQYq#c&#Sp`W&=7TK)7SkBBq z+f!tqVb8fW>m3?9c#s>aazPr-deb!}Q?Xh0AluOcn5AZrJvn^>oRW#Pajvvx?!nQc zRzs_?s2P!I|TDxk#3P0i}pNbi>Z5_^XMeZ2I3P}A~xUR=KL}e zIn?vLsIv?ye32?oTcOkzQi-*TD7<`H2A7`u9D-IkS^N3dT;x6LJ+?CfkQdKj4tJ++ z=S8Ml&Z~kmW~XO|=w)y)Md#U7pu!7#eo=NyaMlaF)0^k~c_G=XmrG8^if>mT z2kZ|j$A%7N+?%_cWjv;mPaa2IA5dXW1kixFT>t(|6##cY>0ZuOpB|KxecoEE%TG6e z=oer+`~XS5Xra9Dk_uN@yi;bq5Gsss_j*v&-y=%mnD-nvf;J7~a6Sq59j|0?9-Vq}W03l2%>#k<04C=rIhULuaLt`Kg!;t>e! z1rr457*VOeRA2`MA&%D>w}Bs{ow1OE^%zZbMuE=Q6)j*v#=3$*8~rgJiiHa3kMTr= zKqAG8OHG7eBQFu_irWy7T|f;gKtQ4*odpO;fGq-j2qz0-#WIa?-5HF=I0Pin7&{5* zs59OfwPc5Z8w5Zl8!Qrcu*7FrEL>n7MdNXjIwbBZ^g;l(w2wAS@N?j$C~~XfAyXz8 ztrO)1eFF}ou`?EobfOT_lLU1v+y&UCc(5}pL>}Rfbj7&LqXt+bAR}>Z5d5)d)RKDC zI=g~hfN<)HBy2oN+;jyy4U5y_I<5!c(&2;s`!ZxHtaOpXB3as|g@T=-PPh>6P&wlw z6pY8ZRAN6Mv@0I>@%Hd}Ndxp{CK2Arw{vWUgeH1u!~>En?ILgMiVsDQ+YGzl0Ygp2V9w+oO~7;ylk z0)AB-AzjfZXuA>-3hzpEX|P$|8G;)I5Eh|}#^4fYRk$;VG~v$9t{Cz1t!WYg2!b1l zg)B`g4UJ1Av~U=C&sKg^MK*W~qM=|TWMN7Iuz09dLyokjuEtaAfyPh+Yp83e59|+I z8#ojg^;{qLhroR-@L}fpC=0yA0zYDbpF#o>@+BN|3Z@I0@jN3L2j~eE^!;G#h=d)u z-9!kWs+G|4gUqSXXc+Shf3smMH1tJ=zSz*082VDf-)`tD4S$DW1P#5@Fv5mEV(2l$ z-(?u94C5lhf3e~3G4y)FpECR#3_swfHW}W{hOyP~UvB6-4F4`eztYgJGW=H?{%Z{X zYYkLr9>)(jRQiXQ z;RO~|09aK1k1(Tdu~GLiBn2du{z+!|K91j~a1VGY{WJIhqN=XRsCyQvKaZS&R;6bQ z{Y$uf1wmiM?`xp=M_j*wFm$!vWaw>1)wke#0Y4BL|Agy5BgMbq`mgv+z(2{nZ)8UO zi?}_B-}jj@=ZCodgc%M0j@tbP>_hwv_diGYFCn@LM68Bi!T(OTVzAMO*R5|%7*`~xZWij-ZvWZJ+k4uS2pxF z8Z{5#@-ErCQ1*sp??tkAE5xqejj$*2dj`Lc;P-L-K8fF_@%t=(pU3Zu_ZOo*y1{lvMp9^G>`H;%3T99v&D{HG-^DVemRV~Z6HL=RN75U|? zu_}~rVvTjt{BpUmwkl338mp=jl%lz6HR77_ zd*u9eFcAu&p|-a`Y^&{7a&Ci^SzFib3<=u0?%D2~+uzTqyoX>7T=GAGtX2}_*w&sevix=O{;fSmn*AalipA#2= zgzK-TED(k&@#mAX!y)oEOm4#*%d>fGI*j-*tk% zX9fM66Z8WFvE<5Mu>4Lb`D;`u`5Ve3DzTc>l}s{?_sS&hegdye~W6-#gwvINm=x-ak3sKRe#PINtwuy#M2P|LS=E=6L_t z@&2FV{k!9R#qs8q!Z5zk@g8%$H#y#$9q%oU_brb1R>ymr;_@-O_$2u6Vm8Lt?td;|yqi;LfA-JMa53Ex@ea4$}PaKaLw1MEU?O8Y`_K-H);l z;>KX*AHv1MDxSc_%POD5#mB1Vk^V>ZQ@AN%HBaMG%4(m%rHocoqytj-5nL)*{YP=B zWOF`-OBHMQI4;$!@e{bzu(_YarIyY66fOZae=Py&HGLX4^{n|bxXfV-K8s5OTL?71 zMz-j4xS7XVp2cN8Tl{%kn%I&r;L^-m$CAb@5wXpUt<8Coq z@fBQ_u$5oMrImH`B>`U(yd5`ftn+J(VDUoNCZ**pd_@vqGm+Qz0~RlOfMD@rgGs>R z#rGuvi6vNn5_nmV1!*XKPg4o#S4;Bj9pTZl;Z5tKvGJu?uALI zizT5Uvx@aBPD-oUnnY5%h^>tzrHk3RWl8B0mg-DOm$LQkNvWG{=)f$^dV@)64coXR zDXnFfZAnV&*rua-C}wti$pICLE4b01wStQdd(mlQqai`1=32|= z1^ix?3s;kE!~PPo7wsj3%GPa;#V7M@_=X}BqA!qx$<99q;OJrCXcCiXlt0Vg++t)5KP zkc_xa7NZHY4X|-Y)+U|c$xbi=jGGktHUbw4 zxre==5-t@=??lRf;wc;Krkvm@2c#3K`CV#C1WoxKPtr&l8%xlXKky`j(jQdwPwIF& zHj#?4bbKNeXQ>1-{4-BIS5tKTHK*8h((T$QHp1@EKzWCjUbS(RlwWu5@-J5Mzi8(FAi3yE?()=s<*7N^TOBgLQK!uBWYUegd6SN(lcL(T(6gJ5 z=y%xB@6gSA^ojB8hEy*)^In}AyO_QMqE`45czW~1#?6cmi4X9Et@i8mF(foUp^vAw;C1>Wk6Wr}nw~-?U*?%S z#H24{am+|9Fe!F45-AG@Zy*m4v>@`PDns*z=Ib}IzPVYfFy*s-* zyXWa6ReeM_&D`9H&0~uruM1SqQ{KM^uWdeDV0I4A2g_g+v#!9 zT>cCccc{;#XAE>8d&V$7V&EBPsjE3`Ukeg_mM6MS`mA9-i`-KOkk1#$gN?oUC1VNF zu9WduE<@UHAZ>I0@)PtpzJWX+X6&1W`AwrmIys)zkHJ)PB{XCAs>c^0k@+nHUz*n; zmv0&&RjK?r%)+Z4#r!7&E0hkZV-#6VTE$NyJ3QSN4f91R{8~nhd&!tQQsqUvPf}I~ zk=6HzIH>5Feh|bzS80oDWw@Ue~z^nYFu~(bu zKV<$Vu9N*k=C5!)o*%}jK{0J&BFzu?A2xrD2$;0L&ipTU&Jop@Iu@U#afl%3e7t`G$)Rs)pvQ&>acEg*?mYxON;wF)av^@<^!H_yt~cmk?ctJ z2*w58+;<@eGtl)QevpVGI;u~2$&Ya2<#lr{+w0z=RD@;i~W7dS)^=>{6&ZSB_i(vx|QCGZu>qb-zk0HWBvdS zXhZr9<_|smWp9_;f6UtDiPRhEMK*urNxv!m=81HkW%DfcW_jbASn3UO|BcN2F=e<4 zXy`hj>HZ8En!gZPwae*aEPWG8-NdBy%`9~@lTyc+Y|;Ia=vLDhp{3Vvi0*fs?iQB1 zg-Mk4DN1q?y;3WX(+M4#0lV zqUV0frJL4-OOeaFc`kj@yFtH`z1wR(1e&)}`nRH&DE)gWebP?C);*O$BvyeKjJ-}eml#) zogox!AB3jf!5AVw>P_FxvUjuQ<5-#ERbGQEJ(nVvr%(l9S3WPxPkG%|f5Q^@XL1cav3He8Y`s!;GpQ7hZ--zdVrdZWH?=@fW7M3mFqD1R~ zP>5p$r1}m|g=NHdP&Sqkba|M`-}jp1UVJnG(`8Ozu%PQo^4m|C$0=|D0$=i`?`7?` z%H|0#s)?24Nu;tqarZK4_Tjjh#BWjk=37o+L2>dFyF->< z_L?ty)AwWQ#w`5+OWn`p{K}Wi-+R;V1PH-9888k0l|Jfkli459(x;jHSFia;v@Vx= z7n5!|VgA{ReOIo9Jx%XP``cynFWzGn2E6Z(&Hwfudjv`T>TQwssT0TcX%$!?cz!=BTc#9$_fDoCL>(Hk?`Ek78KbbgkM0j0slp=0ywNw=4m@%Sc%=P)`4LKR zvk$7d;G~NpLYi9n7{05TM>TKtr5|GEZN5qKcHe|~2W4d5$+PR;_z+<8%(wgSOnVs~ zJYk;S2PizgIJnPeKH!_kzL!=78%cwEDaXX!oc;z&FUl?ork`Wk=NQddTZEUZa+h0* z+zmi|W6V+Wj3-}^jT>jK-ei?D*+VNC<4pbEj*Gggv^wm+RSmCF@XmDQxVttEjqgCJRF@&Girf%Vdy zXLtovsg4j6;plRsSwBIV{h#Dh{v50i71r{~M>m+j%eTgFZDIVfljhvxlQozb&3Q|Z zgvQ@bt?}2?iUEXDr|OIU2!mtl_`vCVrhl|BI#L%jIz(pZEin|>5X5S7z%rJ^c(4R= zOA5(aBEfSR4HeF45Lwu856}}rNz{-t4uwuho!8^Dh63Q2 z=wuux;H<=GD`l@ee^k&sgASWDX6EcI-V0`S;<0Oh*qq zYv8$J1aIjGf9i_#3jQ!#_AL}}AVjg!rdTzNVvlQloCQdQmke-bs(=HfGNnGNr{<1< zqXSy{@YtxaM_l!FLj!~TLvG#t(oMa6eVf+pS+`|vZ*q&C;R))p9HV4xbnswqRqxvV z(f+MgK6}Tq+02NS3gS|gNqaQ_e?MUMJ-0MCEfZ1dllP{;6QET46H*s0~kpgg}Qk9Xdz zGuQ!;H5BOG%SRd1{mRIfOCISTJlGHY6F&>Iki)xOi#9y$zjb?^QhBEsh-*+TKS?Xh46&Es6Ov^rnTN-F1Yw~^eM`P{#VWHFi% zwV21z3+OD?{YyGib@;qF@QuH)`{?)Gwb zBX>7(cMEs7a(5edcd(Ylz=EI4N?5l93x5*MWr693(@2<4Y@#z-1&Dk)Q-SiQG7aaG zUZ&U5d9JaLPI^6y=nUBFqk~?b)=e17*i<05mbG*##rIZGamIngJD{FaEs2#lN9|Fi zQnQSZ;>&k4f{L#o2q#*~WtD!_tlF)m^^H26B~}welNDi@HONS&jEEl{piMxz6fo<- zSoEfR*dI1fHWM5xz7a_kvZ_Q|+Ib@BJhO?iYmxfP%x3aUq{>0Hun@S2SA!=3`>H}| zGh2|2YG<=VWV6IvTA*livRPgTYpI02$`_kmM3gNXJz=gc6nODOi&Uda(&Q+a2$>iiJ!xL* z)ZsX&Jt%gr@#oe~K+(y{A~K zyxr`bNY`X*Zq1!AFPm5)ml3CLb2`x8wlTmIb9;+4da?o-OIVUEQ+AoVCR*NH=D`6% zp5@3`QHzwzfw_DoZ*pV+HD2?)M6^XiEfC3YrxF8o=q^;{q`5y`pRJz&wqLq3TY2j!Sin8Be7ttA+Hz@W1KM_os!DfH92Zp` zUUK9_#XQ7}S}|{a0<9BqN01QhKnn*aAE^8c>iK%Bp8tS)`l#oL3HC-&%{RhSoEWSP z=z<#wSXD`=_VXJ#~Ha5@=eUVMG#;QO#|~SL;|QqrZn@=Dz%xHM+NzWm(UA~ecVge9tEh;;69P+|4~;7@ z0)$Xp;sH3Q0$Fg4o1g$HG1wuH2(O~mhe{a4-noD`#G4DQgqjC(A%_t5!YT#cOsoYE zqgKl`f!aFm&f#t&cjqxA19&Y*<&}V}i)}9~x&WsaR2uWr$5|o2qRW#R?ePUwA@(PzL1u}yOqYG6G+vUyK8z$EOx`;XBjBr8Y zX9mrxGYoZmZiq#qjb~_SZPE9nex@g2ZD!64c^-`d)io0FV7KGcK~vkYb&SjYiW z&)Nf!*auln1UDBDtXTeY%x*doznPYBO|&-Bq$coo85~1~<5A#v)dl8)G~26gWGv5c z7QT>$yeFCoFj2bg#zh<`V#Rg)p23T*{d0mVf4{o?M;3c^6;l{`M{bnm} zN^n!c`b*6=epZfomRX3+Rq2{^ZMHU;uFh6-haVnP71mV;vBjHtaulz@6m2|vQhaS& z(Q&e>7|H(&1209&!65b)D&@9qvY~%y;2>1nrlCa?pQ&_#Az_AbtD{Jm^UZKUeyRP?xwa;0j=)nZz+(hGN5Dyq3?Hf=$s8I!lCeGw zF3UPIXbTr9-kBxc>a{Hh$jg1Hl#8S?Rhl>gEi2W?~1Eo zXt=9kGFcN&fV~|Fb%s<}u!%!uJ{SsE@0v3>`Il(6>c~p8D+FtYp-REYu4kGLhC%(F z5~v}UHk37#*Oz+8xJ{Q*Vx6mdygontAvdd=w2LdCWlW1dwc21chFWW=0YinY!#PIj zTtk^>sPhfA$&eQq@J|&p^>hOab*oP zZTSYdp{BNjLUD~)*O+x(WnC|}u9sTZB(AU&lDfHvaxdQ?_g=Pf6L&XrcPn=<=k9jy z?%-}8cXx7k7k97V?v>oVin~{*DYxC+zlT+KcvZHXmHN7+b~FQ=a$ML7zMo!6{Bi}7 zKd@SWwJ+@6sKhVVvF9c!2jY}_{KPf)!YU5z-oPpj?A|Qpc5kqHEM?WSN-ixUql21m zt&$bkTR2AR;Rad{t5SnGmuue4AKyuuH_&{rSmltm#A3JEzK0Nzf%^saJ;dd_xL-tM zKC@*!>l2Lhap>M?Fw|<@gRBJiOYD1)mEyh?oB>%;bb}1N2B{_u5}ZaBgrQbgGD%f{ z1sf*8>q-dkM<9+#eC#NRj4L+TrGo5IBD>T~aa7TH=NQ)M)~0i|sfWLwS4 z$Fp^UMcZa>Cr$+kkYtgfkHkS5Ar8_Y^-<<<+T~qf{VG?OS4?E*=4J3=~8#zb}=^kTA2&6BBSBtL}YhK%H7-gZnRAEV@B=Jj@RQjWO+={%Gz3B~0(pSJ;m z3zRa?Oh{5%SubRhEmBrXEdtF=#G~=rT?#`z{88M=iSA_PT^3ObRcWzYsM6br47x(P zL2`%>SY!`yvIii|?Iv4-COk;#p){l$BrioOR@A$X^7M}~s9TA;@nTwKr+SYQT?v>? zyiHGXx*q9C(5+!lGV^Ipmt88e(u4lM%6zl=vXpVEQE7HMqd$v88?#y-u(;e9k z?$Cy7-T~71qB6cx^D?$uQ+HfBZUMvISk-KMby!EMMYi}VOk?EmHP&=)&gnpp#dk-3 zdwm67iDcRCsIbE_t3;VaOm;XMvon4wFR1OVPi3L)TyiJYm4M0AfG1D}i@6rBk{eOO z2`U-Q^+H$&FQspa*$$WJj*)D_BNH||S|GZ^r!-k=AkiH-s*K5v&OsosgM$sFsNIg| zz>c8D4hA%A-Ap})-U1t)++YA!EA}v0+FXoPJtbxO)s@U~=Z#V01E*fpD(Bzh_^nmb z*|)t#MFZSrbhvNCma6FCgF9J=Q;`lV)b-)LWTM)!lzUTBGiEH0J~?BD)_xz=KjrAS6a)44P65c%1{jqEk7U47l~ z;1El<6)R#2>FDqd%o#)bEvqL#O2 zQW>}7R8ET@8A{7o2;n`|Eb~ne1#r&(6&!w&mI#;bS0xW5_`v-0?Pj}RdrxLq)c7&M z6YEX$BN;>lXinfO37m=ENNb^TI*}g57vC?HpMr!zrCB+VR`I zw)b7NXZ^aqlETf7b$wfBKgCf+idb=5?G%mS>KL4JRmoLWN63+JdW464S0+lVFMmdf2s|5 zZ8sDM$p*a2^xbj`BOCCVZ0uHAWU>LTE1unIi{jXTFL~LZmx#YT^v2kO&M=j*AKIyW|2TKRbp=KzW zGjMMv^D<5}A$b8^y*xex=0ck3H7ucMBai(ut$|w2HZU+~Qw`1Bl!mVeZnJvIkW(Jg z=A&~=YdKP#kqBcYNDeJWN(#%7x%kdG%aN%YEAj0op=qHFWq81$=vFbmHCQWwslr#T z^krMtty{Y%xqbc4&Fi-G?U2gF{hGesUCF-Qty{eOe*3x|eI*-`JN9hdMuEvq9xPh+ zti5u}j&cfxp@Zb+JzJ8S*X_7w_A43Q25XNvlNyDqrWln)MY&x`tQ8LLh_f$o&cCWf zcMPt2*e_5BdxJzATLf4;Pec`9he8M`QEap3cTrn!5_T1Q2^0XHC6_*$vIH^=87~VY zk-#0U_tx19AxL>*A!L-urR8N6+^ytp6?dz-Tf^O2?#^KzuUHi6YPX87B=Jn~!eLRQ zcVn}HrI6OG8MG);x)npi!dmW@4PC*jAT!Tej7c4~K=IC`#K%&{B8m0$MUsI4&tcq55`fE#3V<4)JLI-TLA@>(}x2;Pa|#B~YD&(O7!bO5JNG zuc@YeX>ZmWB!}J*4^oN+`yVU;C@jZq*25^?h>o?x$(}WR{rmZMR^3i7QL^5(_oPIt z>_mEBa{Zp(wURHjDY<^fo-JFqth2nEl2>1~^Hmw$RN!j6K#UdjVE^lna(0z|kc)O2 zd&E`a3<(W)uRpqArWzO8XK%5s-Ey&EHeF88QcBXYG<7&y4<7Iw_)8?zI(GJkLoPYY zRlPf|NC_<@x46HTB>cJ3gj=aeFeKbO<7R%AWld?2~>FM0u7$IfrXwWfs5*ygs(TiQZc~* zV%JAX9Z(~Lz>^Gtr%Ho~bFO+rn`7vWhCI)Z?QOcPCtOCGAul)Nc0-OBa>DRl zY#5gq@}*#rC^X@Dyrp?K5N&GCSFx(V(mXT?m+{Haw?bYS?C9ifh`V9#M!6f~Zk)Sa z++D@p)!gl7jdQ)=yy$cKX_ABP1kR3h4y~s(^n;6nSyS>#%+R<>h6f=jR!_4iwv=@= zi(;z@&?n558f(N7gTbganaT!Zg0>c=m@T)9E#*a+EdkO-Tgr!?TPZYXZll6FWKiJ?DC z_(VF6o`PnajCONv;6xhYV56ki4vh&YmW*0F8ZO+Wn|>^c=4Iyv({rFEOKPH-`;O6pTSb}=>)dia{n2{>Yd^pAFXSgJJ%|F z^=YNx4K2yRG<3$QEB_#r?r{grVCv+wtU68$DZW)Hai_CB8$MAY@jvywkSslv2^JdQ z-j=R%({g_Y#EH3DBcFpyEd4?rHR~(}b4ki1V}HxsmJuz>F?}#m$3Nc(`VT?EG&j0x zZ6>#GWbiPlm#WQ!x#k&cww+$#0ZzC#(>FY$jYW-9opH9lpwThI9__Tc+VeN$93Zit z@YsEgsX5`XdrgUi0C-<$lmdWsn3Hsd6!*_+qXx)#Il+ZhJ=j5cJT-wjn$|FNK{7#b z;P^BSxm88TtwJ#mqN~-wH}}qgBtx^IKt!Ph@~MW>>Rlpu+1R`(2H^+j5XbaXU|#hH z^3WZUC8I%ZoHutqcbmAofV+#hyLc(ZwsHS5R#6Ggb_pg_zKN4C1B1cMa9WSOTv?J> z+nmi!lY+)7utdcKHHE`X*aifp#*ryh$w&J-AC{X~Y?knSowejtwOXVCGuy1hh7AY! z*t@lvRW#|*98S`uHHZu#hBkD@)0nn!E-n;<=7>3Wj@dYY`4`co_10c%&cg*eN@PY# za81a}#f{d|Rixh(B!?Ea6@~5J=WyaZ^BkA$AG@I=1;^nn*|XgGwxX}^N+MY`jpTwP zc#6++9aPThspViS8^io{%~^xdv&XuhLH@i*Wv4aQVrABzR#FSBL(CwWO1Yl>fNyEh z{##`WgF8JQDVnfYM|TKgDRi{QXZhk2R#D0!%**^pP^?l(2CledS5a!DCgN#=kHtR@ zWlqaDV_wJ$7q^mAv@l|l!EiHXWum8YW3%s}!JOC;6Pf)nuq1xZDVOzJJW=%6y1u@3 z+s}zwh}99bV;*S+E^VKUbHV=R6H*(;&-0(IgC28 z*o)7G=wrbQ#jWTpctpF;VPHXua$g2!kYFJAQ2%J3b#Ch;SQC;_7}{Sp^~F4g5pN#? zyZEYS{2X7zD&)E3wuEF34p)K4N-b^5$=X1$VlIH5q0v6NV)%C-MaIMy%tVkSYT_H?0N02^Ly63$d_(6rh|XDI4q~ zMJOP%%w-fxaH)JVMH)KTc|qt8p}N>N36#eOLSqzamcg52~k_9+%kmv?3!;!Xdi`E zAks$Y8L_)T^V;!j)dN-FeM8C*0Or|hj`y}7 zq2t+_Y%RYA&^)9dxV$>Kt>RK79vsisR{19K`CBLFbw4OI}KFo#71FbKgk zh01xh_82MTHy`V-HLpW8N(n-74yrMVY8**7j<>I9uWm1EpTA2S8e2l_=iQ;$7zAP_CS&Db6+4VM&-{ww-;&R|@`I zW+V&KU9@oV?CsBS&lGLqQhd>S?PNLi@L2A^8G(PM^dcne9ld1!Ew*$)T)OOyJr;({ z6iW1eOQh%tg0+&qX!gBmS3)cTrm3}0Rbel&6x!F2s;qvHGpP%RE~0`Z148GWC-DyE zdc|}19s)|*Agx*}3+34%RXnaBX+@q=I}y*OL<}xeZ7`E7qPu+#JuY-nMOCMB!ONzO z(Gp(vP9SbUWX{d@BoHo77S>{^rUq6|{iFL1te$;`+sxoX=hzEdt$$>s|EL8mH+YT` zc-FagQI-FqV+ab?0)2`G?araW>&7yCIm&s{#e@ZCP>(<3D(w6xBR31%o(GD*@%9o7 z8Xe$Lhm~jqY;Bkz#A++vH3gLb3$rNB;X;Y>>1~E_y+m!%ZUQqqQAVpO2-KE)sT?5^tNYtPB|AVi57GFtjQ|7R#zSL#xNK3d<*T0a=X$ zQ`=Z$scZ?t1QS;BGH> zFXQee?r!1kHnybI>t%~@Lf0);b^OAhECFWA9L{WkLIsvfFna>fA*Gv+*L7Gw(ZQ|8 z8jvj^rnd)hMb5E0Qfo1M8o|>xOLjv&Vxvr|5~aJ9w7O9x3nk^dwRT^-zrCcr)U4R0 zf_Yp+Yo=O!m9cVAwYQLvAxD|ife~IQ)j?JepWlg;0Z7T30g@%GVT(<`mwP6j=5Xrh zt2W#<PdOQf>{hy@d@z4kGWyR^%D^K@lJ{agev|E3sroXD2O=bg8PlN zHR0QG?sucK@)VYqV1W}udtwrr%AKgQs(4jxlIk2LRR|pbu@xtq^W}uu(;`LD0v0!; z>B^0jQoiyfGY&K#4IHCm`}B%Cu&~+-?dV0I0=AFbWp+)bE3y^0A_rg!RZT*Xg8+DF z8F{=JAn{mTn-@<^!dOQQs(1-}wd8}yCpu-Wk}`Y1?SS)1fUZS7@Z#q{(;yY{7?nRk<2@e3jE8is@(^xxk7jNmOmU4MeF*&Ma*ljU z599JvEXa14JJ79kqCnk>Q?w~VL&^aJYg9#uA;E|ms zZx`+mkEhsbx_1cthB3Yr6|yjIV;g#}YBh!yJ;R2dVr{3`*8Y#O`Cn&`v2ixRCfRXz z3wxREJ6NH?^dDPsUF9d)y)2cy;SpB0w(0%sarOcB5%x|t?=4KezTt}d*scfIhuG^d zQg(0g?ySF`E&D1f&3%}yS^wH2SI<3Ao_z;2}KE_ryuFE{ZJ^{U(iP5%@|yLaUbt*I8t4KP(%Sg?;Py;)TeSzFc&87?Jx;uAtbp zc0LyqOp8W#BiOP?*QIgW{yv$6{nOErGjQ@HuqXbPO{6R40?MqJE#dnK+i4%X(|kmS zrfb7o%8r7T`X7Du644y|`K`j5CSoBDzOc_p6jCCnd@jua9!Q?m;blf%R|clotGLK} z+U_Jqd##4qn=8?Ro`VV)QDf_MD@v!wwR-qNW_IYQ9Fl8j z{slGh^xWrb_;BD0*7tf;lhxY=6(#wyd$jF!De8U5Ht+?C*tO~ynSZaD)c(dnja(@3 zUJ9vK`X!?YPvD9?JS?2T;G*mHy`3q?77`$Y%_lMAce(KEmd}T>jTFuRT?}}^3 z16?78!Fv8KRNGlbY2nZr)cUK3XxQ1J^+Jx4t@UuXI=Z(9|@>tYFTCe-{ zlKFG%a0G0J@>d`yEMsNYq$O;I69Ea(=j@PJEOOU(sE-Bn0a2GD(b(qn+WnaQp8kN-Ar4+`vOzNtk8c zgcV0X2_YPWFH^Y_zDUA;b*uB=W>`^?A)(*RlcgsE$wC$af6}s(u_J=2)#!~8S&311 zR|cc1JUzAniN$abb31g4s!I6%NC8eelB)=duC!ao+u~tFk7gL3FRs3R|B1}1ww=8U zf5FQ5>mFUX4(NBny6O!7zVMSw;x&qc+F*>&o=O({5av8MW5qF^WQ#r?D&F&F-x3m> zcu7h+AnU;>+7Y?!C`#%*e*YddAk8(}yf|**HtbjhIQcLHeiP`n+ZHXr8s2>8m@}(u zH7yiYjs|=B*e^adIWHsE^tm~nluuxS5rnP3!Cj|E3#{|i_eWGEkA}I?5vW_nx+y73 zVUlx$6P|-jN~`G-$wC^d7m$G!lA-??k-+oWSl1(}g0=!0C#sVi$|0$=rxQJlA6y~H z_PLd$oNHl<$9P2@)-LlENVTU=Q5aJlVoOt(iIb5*l{;Xa?ylP*al=O)hkf3}K|B{H zG4)a)EKse2F{Ta~IY}W7VLNmIC)TaD+NdU>Oy#D60g)4t7eo6O9bTXjQTgT? z$%kC=0D1E0kcAsU^HmNhPK_ysBn~RVfl5V|g*~Q8x^KjsT1MJeJvma+50CwFo-WDw z2>wYfLt)GuzL)>Uj-~l!6W+P`API4pi?}o;`jZ%Lft_u3oS+sp0OQylZeIExD-3TL zU(3B3bJX)Eg4e_{*8vfu9KbDQBH}!UZXsw%ZHI>9{K*eXTB^L-qMH+C58{$=QZ8JH zEu0xri61BaFgI#B`krql-sf=pNDZDjR`QgRNRs>fqt#u6wdT97vbA#v1nL;;AA)mxzq`NF+|o5a@-l;5l&g z2AhSfY3HFt406Q+6NbO2T%wZ0AS22E6R?DxpeQ>CL%yq`WA=ip$akm`L?*V2O~L}& z!REoH8fqv6!mfkwBlfgw#O7-Zg-W41m0MKiiSt5gMvh=TIJnr2#8=~Z*xNa12oMmc zt=a5|KiJ7wt*=SUFDoIhg}Ea4QcIh|a`l-*ZjNZWmUtW&q#SXnWiG!f$P%);%L-mD zA$0;E+BFnQHp>8iqq8*{kp19cV={!|5_9Mn9M&VfmM7iITNjz|&M7^E!cDE+-)7{JFPOBrvuD)MR)@0IC9))QffZ;uHz9Qw)3Ahl9>#$4^o zMkvU4z|V#Yu@Y-h5;TOQQqg(ZH7{z_6d#AnPt9^i3>y&C@HFb4T&rVSFamrXrToKR;-ChJBp3F zk%I~)n4 z6rf*3=xdUbXGy`4M57T;W3MUNxivC;T&dwjxm@(Q)n9hGdtrT=|HUKc4xI$-FXv=p ze2!rsNpk?OBxK+vWX}HLc#J_e5;Q<{=Mdns%NW$kM-o=c^UV+Fy>}a=Z`f%J&~V#f zK&2=bA+<`U8*tYouDMY2F+>P?FyqRbC~C+H{54j!9bAD?{#7lX&jr85!REYOCU3}X zPYBQS^NQO(n&xJ$!Z@$pFg=W?O*j3;ekDX%phO;)`yz#gc%yzMGlRA9#@Hcm&1y?GQnB}xiY~<1-i08seG6H zN;Qo&x4lyO1ouS+P2oz#YMz%&y31yTAlHS8a<5|g?M6i)mpz1XDC_s_=>FH=K(J8T z`&Y7Wl9Bzd8b~^udWQ>wg?bYg50OhD#R2h)1L>xc;U3BXpE+cv7@%3e zXE&KCI*1nPO|z5rb4kngYXag&~K!G z&mOY>G*kYgo-&1d7=(Tk1$>4AK262Hi^)Rir{ITmZm~hZfPT{yRJezFGEyv%Bp^sH z}i#X6Qg%$2W7!cG%wog0tiueEt z_$(n4rJ6!TT$$`N#qt%Um`X-?uml9jr?4VE90P)+Q;N|*w9s$0WTMnls)!GqfFR|R zVri(l^bgTqvO$)qf9Ufv_U;eJFKHZd8_=ga25wfW^K#*DrD*S`FxCq6REc9Cr87VFZ6A+}4@{erx z;v$q&|Cm-lR*VbkgL-oj2a-*_!aWQCf{MxZS*QLbC<5@ALMF;IOp<_R5y|?a1%qDt_`)tFjise&sAS`HAQZrWfz(@)A4zGR5b?vWLtw&=FD|@ePT5S zzHQ5mROT#SIx}UhgbiyOK^cQ}!OY%lTRv@@?v_EXKJ~HNGo1RP^^5!qTxh@8kK$dD zUVY{^)fS90oSExYCdD-h{HlSv*xJ->M<-nMcMSObP*5RXg-OB-u5 zoVt8&a4I%thmwsc;DomNgyVzbw}Mu~9B>37)_}aNsr4$xfPOUM)1yph`r5lQiLQNl zb6dUa((1)=j>@594mj*W;gC27oaQRKw0>dck(v^T=tX&jDv~&@$89 z|MaI<+u%>m21|8J@kN?QXw}UD7vEzY(zj8!(9~}@c7BV_6V^%E431|l&#UBq@dT#r z8!@)+o5x?Aa&vr;8%nNqaC{i+NUaIvev$O0R$p1Yd^m+wKXah`=EYd2K3@8wFPekF zue$5-@+?o#{QD*4oaPP#Ost;g_+YQ2m`T~rzqTpsoVsSlp?0X7`wrWcT;s|8B3DH3 zFt!ODJ4N>%nETGLj`>C2R@~ed^NYSs)EqYE7j>JcwPDOJ<~C7F`?8mr>qUK7^+2l^ z+-r7|p=MIBY%*V*f)Et)cvsq3cgpfZ%1YuBxSGL-3S*Ie;6^V~0DLHRZG+%I88 z4DX1!@9rM#$bsJ5#EUIX*(`ld8pYzgXL12+|J6`!lNl#hA7$ zz7{h_Q{hskGIec2FTUo?(WiPz<)CHrswiI8$`L3gAhnh=x1c~?Hevlj2E`y%l(8+j z@+?)DwmquBuU=*S5~C%)hL3O3ad(F9n!RnQ!M)orX_G8zBnc|y2!zleqPR;t)c!~M zKI@l^c0hID5Hfi`xd%kSJw9AO3=sFJZ3Ttm4)U#FO$qcxR-B!L{suPXE1w@Lg!r(# z!azX^^#<^Yn~D|#%J%-4iWUdz{t^RG{wuq?Dpa5IZLf;9F+oTmSTYZaclRaI3>V4= z_!QDK2-OJJ{rNYal9g(Z6QNOGxTmxI8s3SLp^1GxNXXEhBad%ZCz)`Pe-Z^?E{dRn zn$!?(E((W1B#6Z`QeYk(ooK$$L>ZqTU0^JGEK}flg_rXz8AFn-Kio0VQGh<~%I$K} z-|N=YlHGPW#yr7Xpo!ao$6TO}+eOe&pqkx|?_8jq-AQ;;pqQPBZ(Sgty@|(NAgdcD zy&tbMRL;0b;K(0eCX}7$}SDFHFGlIv5=?Rz`1b`QzPg=bduoTVV_gL+SD`M9ou#iFu%m7>w?EF z!>8$@g%tG&suZ_OX#=f6Sc0ET%?lI_QIYKKJqULx9{mK>ff4ox112YPRSor*>>|% zB~qPr@$T90OmE*Pe6^p5U`>8=y_VESP<{VSjO>`8~L%H{ z6UcZ##uq9a65$SccNl?~7*)`RvX1Xv(1T+5W8D8ru10-E|0-56L6FaOpyBuVX@WPG zITfGjybnQPK|>OBBH3B(add)YK}``7KKX*CYWPo)@Url#BH&(kQQI2li46Z)b(bz4 zc0uVLcu0V#MR@6+zO$BRNC58Eh5int=m6pMlSs-z)$0?%KtZ8OGxh|+g3288%+wg`x@=G^Mo^sY%l^C5#CHQ zxGgD+4sDWt2CGMLr5FK`h&QQznS!ObWWxu zV?dO?IG8(>Wo1@Sxc)CLH)Vu5wFk^O1n?(DEZ)&+RSv{&Zp%Xn&N5&9W=_@^s<~?5 za-2$=U;9+T#SiR={RO=i{gS(81h8-eHH(SoT^*vl_Ir&swS6ma@s951Ii>Ub1}HEg zj1!ww;4A|m&Qm=~zrMILu1a6u{il9fBsPAt_>AId?$7Cu9BqMl28Fu0R*=3;rgGa% z>zhpvaG0Uk=5Yo$2m9Tp4x;)Hd)?+IaK09*-v30xvnXUG4_5lnKYoru*b)4>r?+;Z zpefn#v1)tdEq)&QogR^oA|8i{z3!R4E+B7RiDl*ALe5?4J zX~XeGY(w7g3&h}=8&cQdl-HoAW6Po%lA%9)*zWb_(57Q*zpm1z-QhTg9k2v&vE7Xe z@ch}R<`!*g9;K8I-ACcVOzJU9Ml1Y~a0G4{V$^YS_1F_>uK+nb9M|%Y5#{+i1^o z_3Tm?lE=N?m4p0_jI);Hj^oO68LV^6HA+6XU4d$-yow}SV52ZNuAtnup%uMdU)5k! zO~>n-$2`rO1MPkLlGS13=#i%1pr+?CFyW-A!j9--F8I5V`*-?T?z+hQMrRYJ;8Oy$ zY|EyXk*&|=m(CeiU#I6lj}B@3hDw{aW8a*k*Lbf@p0V#d%;PVR<6N&#Uc;bIc~8>$ zzo;E|X&wcFQ=zB6kvE-rHm{U70?2xrc;{FK#xC=0@_RdT2%jt*N4b9Yo7eTIH?{Mq za9SSoc&3|}JLlOL@;LMIUY%^5+IMrZgu90<-a2b6YL=Q;1UuI|)MHZ-hW zzc=*FIR}JyIOpALb^hLIoUFfDbvk+MQ>z45BkT_fb_EeJQaBQWpgckt3qdQg^rVCD9=aP-{3^c@Fc?J?{N3D0YI zqTxs7_HeN5+}E@#r{jNIg6;poJchaGyOFs49ZEbM2A$=2yX6t{`=$HSz4_Y^=h^TQ z^==Cld_uILsJ0QJ`sT|%MS5H1?Rt%Ixh`p6{jm3WM3$W=d~WtW=DGsj<2+V^Y;(L< zxj0=f*%#Lc7q{H=AjLVro`3STEs1hSg1&5({=40vzv2Vs zT(5QB^IjTzV4A3z&LY><6~9eox+*85@cjE~)^`4IeI;~f?wr>k*PbT@pDX!7w%&5}dc#t(@@G?5y}i#40T1j`#KsU8ArT(C>pHGM zmr7fyp=!?L^UsZYd!C?A9#6Ebwun_HE4MWw1z^6u|_wr&Lp? zOy&0ZRJXsxW&`FbQ{YjBf4+(9F3P09W_!N7 zi*tR?4I8_wIl{LgVY#p8hV_A!>{UCSS-F@@Zyaq?&m&(>N8&bnvri^hCPpGdx4|*F zuPvbD9Bu@lPc;mO=LwAH}+Xty`Iz;k#Tk+~=GD{~`}36hYs++?<=pR#Ume1RZ( z8tG8mEME#TmZu6Vr$jj_*|9#!|_}|UOfgMlgZ&?k>yL@L1*}! zxd@AUARe55)(9&k$<)8)>-J3Vlpn9`fwa}ZFKd}{vhmQ>4NqBinX`KTt>dECXbWQH z^B4woNfd5YoEj^9bZ{sQUmY*F*Zg~v7#ALF=v1f7yb)gjsYChAtXAAJ6Irr|#%F1H z5h*S0=np%5$i*u!x8YsA_7&4fB*OkgF4CJ#tcanbu>tb^Or0k^w^V3bA3-b!SE&^p z*7ST0N>2;%fs2|@lZPI{)sRW@GaE$Oe8NGxhra zAhwRAski1VHxWtc(Siv)w7{9rvS!q=;j*@}r6a_e$0YE<@|a?jEi!oKwqB&|yArem zu~wAv{(|G+P|_UL6S-1qQqd2gvk=emB)MIfb)t{_EHLD@*n7cAJiw`qcZ=nY>#`an zkoMF~2%zgS8(YgTWRuJH zCMCHgZP>ry_uHLpg8y9Pbg13%Y}w>%5wwlleO<^A>47#7l*Bm)ijb9T$8%^}e-;_q zbe6^i@Q-xO7T{>;YO5DVtz9$UC9dL}k0pW6%n=(cSvY$$kJK48dIb=@f8Od&H{ugq zT#+(y$qdV@CMJ;hcGn?A9qX}P%#9j@z?7bdC2d|MTwEO(iQI0$b^@cgCIZbiPRB3o zRH#|5A*oF~pW{g=B@;D{J6nby${rX{j*P@$nwvwSs_<7dBN#dDs)q-pb7|aPJ1#%} z1QC2%wIPg(e!@s<@Daq`H>X5X3o)G?3X!mwsZ$eCQL(!C6QuM+(Q9tPx@oTPU6&D= zkb=okVvNTmuEc1=qccSxE13}uy^s72kJ@MW4-Qac@0-AeLP%F~k!EDTmu`*YxeJ~C za|q)^@`u9;!Jq5%cbN~>`B>C*3F5^VzkVI6M3GVtzhWMC@;5SFdjh@Vio?F&)8J}_ zv8&)%Zs(`?mW#O)ojxP9&OHF!QagWWSMi!h=RxRC9g%h5*C&cgUz!F6L}LL7Uf>6H zl)mx8OmY2o+i3mE1C`p439};Fbqi=o2YfVmT^OClUHm z#+fyrQ$hOTtAY}6VmUha3w`|lFEtt(G#C4hgKuQPcQO$1%kXSD$$4`(ME6CJ_2hmHwJErTjQ zT`U7QHN-NBTvvU}sX5(K7tx^Bv-jDH8srlUuBC0BGlJR`h^Z3$4t>A)Nl)zECY0j3O{Pu_|NjY2oJ@mUmhG!wiOH86xv3CaM43{M?L zjO|A*4BP}9;_x+*oF*N75ZHYtmL3hUSOn~(Sqw9Eb6o1Ro3HzPYM3^NV~^DoDJvba zVBvoEE9BGW-tSJZ#ZWI_5%p_6YHA}XDIpo0T%g;(+qJ}YOB4*z$4Su5Z1S``-`Dxq zMh7FDq=HoSlo>_m2AY*zrzc@UtI^nXd2k7Df-T2axdmtR!a{*|DQbV0ac(;E+ct>B>QOYVYskkUf)51K@w4N@}W%-8^-hCgurKu1i+`TfZhC zUG5LYh|3ecN@D__npV8L_|S`+zd2bb6r@5N)bp_8$CX!0A&Y)}>N!v3e3oC-pGgB= z7T@Yda}KHg+A_$`|6eAml<3)F=BVYTGFy(L!;cGX%Rt!rp9d40$A``65kD0b*!;Ez zxw!*XhYzQh66VrA)3cEX2|Q*G2Bc#v^77bXxnl8u4$x=jOPZx_#KcxC2Pd3Hpqm&f z^69F%LZgmmqTx*afya#l6Xumx1RZ!R!WzkGf=Nuy3mp88Gapa*a%Uet8#!w-YMjo@ z6H-k-gRD*}@xre}p2MHzic%$XN~Gb9%r7a8m@UxVPt0?&d*D$9nxy;M4-4n@^Y%xB z`zJ5`9l3{(8b@TL!C)$?J~HP<#nsU3kBL_F>-M4`AIBW;z=SuB!^LeHYa&9W!SG%{ zDsN)2z4w2{tb@Fl0miX9WSLEGER3R%_&m5Vqc)u!dJA129m0^f939$_xEvnpkhq*3 zqLAEz4qZrYEdwx^wZ}0suOQ)nomhU;n>mT_Ut}IE@XmptgIH=S`4ynKNO!z4mzXNR zOHhFf&Ea4gf!#kUE99o+sd{rN>$foSfCvS`(n0j$@1@&dXH}~OnPgmpJ0^gG;4brI zHK`FWYBej|)z1DgD-ddB#*jJD;DB(Pu}kgl@QwJ0ND~O|MU!?1o!&e*p+jmI-Jbgj$kMBe?|s zw!*j3&7JANn}%RVt5OIz2&9G$GBt1V0CS>)hiF!x+9fUBaR8{qlZ`F;ff0$7vjc z_CVp}Md8%Ws|gh)%Z5f?U((X6w$-2lRiJS0R5!3Y?+V+|N^(x$;fn#io>6LGh@|_^Fk({)CGlOO(VI=>!*5sR!n+!zY4T~3vdt$od$_xV?jBDy zNr*-j^2u~CQ-OI(=p#h*3m+3&&~)EYp$qB&qHP3t-3kykin?2JQ&GJ-P~Vp$-Kivu zXI=oqi+Zjd9@cQ^;XnfN?tK6h$;G*}FPrtUAfbW?b@`dZV>fa$4pGS|+W4kYe|b4D zws}gOlq*f()9jmZ95$1ZjABbX$OxSFPkeO=8GfkaN}u=g8l50&3}f6pCEPS<3CUx= zIbzSSE_>bq|`_fr|cbkc;z&k68_n&0|Vv>zsi={l6ynx#)IrEuY-wpB+ z6{JfZAm^Mi=Nxy5igma+c0xE;yc5YQXzpfwr^YdsMpEQd>F$xs8d%8$^<>zc6ShJX zGcufduz|#xNPskzlEj$fOR>BXDt zGs)o;K=~I!LdiqH@XCSint2c*&g3~zevt%J_yni2M|5GXWyTDH+6jhkx8a6yRCUAi zG1`~SrgjWiEgpSAX+i)YsA|qW3>Ax5W^H9_E;i-A!O%1KTGDx8i_P}dhhi&rGuWx?jvhzuDO=O7?k9a64`$Ol( zV(!Dzq(`z9ADlZ#zMOY*(k%~`uM~VL6@1#nYmWY?hy;TI(vfzy$CMn_7kfD_*#v75 zJY>MBE1t6m=RHp6uH5#h#G=A|Vw($7^od%%*i`u_UWEKG;UuAQE$S+#8ATAVj0KNS|glK~qUmK;;^TU}t33TnQl zhAeEU>Qvagn~+JwiS#Vu+Dse-N<4p4Ed#2P(X_k7->XDB1QcilZfKY*F@mO?#gP-X z^dGqa*oB003f*h>=n%X>54KZw32ty04X8Ku;h;%%xn=_cy*4{`)a*ZQ^r+q>H2&R4 z-#H@(RtyCutL`PE-$T&D7(XSB035bK?KOGb2=GI}}VJik%6Lnjd`RuK;8nxtJ_zX%^ND4s&1& z9A-PUgO%dzpkt#1CZgfUrK(qq7BDZ-LgR+5VPVAus!OR?Q~emjs>?kx}oLxenMM7 zD-&nqjMPkY2LGwQpfN*Au$jytHvT~MquyPPAOuA$^|d%!b&DQmt}*r@u*!W|PVeCA z9Y1oOa5EQNKBW1_tI5$$wwHevz=th-GFd$D!0V}{x~-g3exEa=mjge*ph3A#B*et{ z&%{(OtKOYR2S#oq-t`j=E~fLj-!0s2e1{&IwP(~7pG4|s*5fjke>j`OatA_g={*?cs+jr>;h> zsJf%c*p1BJM)e99!Y%lQ;FwUFTZdL+sly+v$kaLu8Xah}$c%G9_lgB@k_9 z7QrP%k5r$gW<`Wv;|%|R_?BkFmD0zy z(W2KuleFOP!H?~cVY3(0PJF@8t4L>Upn_k_@+>w4K}!a#n(#|6O@q`FZ{UB`6)-x1 zOLW(IHa5Q}A2@V)Vh2-Vj%t4qYJ#j7?Z7?WkSUXbB`}?3<#yB~oqm(up8HXzPhnkz zZ`x@B3~J$6K{T|IT6MnSD}G4B0iode6jng|0qKAT?@M^ zSxB~w?8OUd8StePpGwMI!tHr#{?x~zL9*G{H154MCt?^mphR>1 zYwbx1ww`3ov#iIZ-G#X0&!4v@Z$*29uw_CUCK<3fD#L!Ap{ql5eortZAF%En){EkK zBP9~6lC+-CAU#(rKT%)0oH(+P#&7nOmef?6QrB%2eJtaQDAN%RPw6XSRj9oue9uK} z-{hC)4ajF+!4ju0wn)rV-Mz^ z+-LBDW7+>yT(f!~DQlJOY(zvq7Se)fmF~;^_s== znTKMik}aUX;zs4w_|B+oEtD4|GS~d48}R-x-{a|}f$k}!r~2?^us^Rc7}SXB;Oa9LKP_MVi16p%|6Gu#~;q0Vahg<#@xMNxa&P-E2sEDTIWC z^-zTjiy`M=wm}Sx@Dsr2{6~_zL_(1U2i8pjhCv=nM+UmopiBp&Bd&T~s)4+ggpr^Ut4u|8#Qn`TypA&>;;8fzZy#XoJws#ORGse^IpH zAtEFMYz>}cl^T?@E?}R|EA=Fi%6gsWs6s=V$6^{wi#N>&2@9uX0s(qDUQdsv$ud>q zY@M#6ogJrc3oWJ%Fhf!gJd$2WmxvNdqt<$m*1@7;wHhB+;i1;6!T;k2t}lzvw0+-{ zA`kK{=L)BdBdC%mVG%oU3TTt|hPm*?Jo2_76J|n;gqa&vW=_4YJhxgxX_6VRWhe? z-xSg&_2pWxS)mRtgtV^fm1y8zskF|P$$3v74X-`gTkY_`6gbCzUYl#$Un}-l)vRBN z(>G9KJ+H$zP`-|(1*Qn(O(Jg-8OO)hI1FCJ8L!L`z< ze-Pm6$p1<^YkBDCL>e;IwBW$%XLlN}gZmk50>`_vHL*IXHEJBghmCH5naXnQS~5V$_R6pnaWW)CUC$CW6_ zo7*%c_#+&@i%x-y&OGXL9r&XOdKb9ZgOaRBp{Sx1*%t2Zk?I*OZm-4JxnpqL2f3Il zrZ*b$!)e@yr(%(CX)Gs{zZ9sJ&3^w0mg4|HR9_M6~>@ z-4AzTDNNfj>E-lQ<(rLhx)cq6CIg%KILLn-BkK=AcLMHk1~@Iu-)n1ccJVJ@Pv@h6 zQC|LCgo7=Spz{RA7t#@Bmk=t8g`<#wT2|w*#T3iY3NU{sv$%mFIowK>W2kV=oX;wT zbDR?&Akk1N6Fej&afO5|+X^pp3h*p(o(HdKs3x8(@5qiVaSF()MX$E z3!yvJwwt$ULO zLSEdsU=UO-63a!H*p)wPEftY&{E__n>U@KLOL$G{{l2#RnVZcPHJUbYkH?5lK3P z-XoJrhwKm7MKRj2P*gjR_Z&{Lh*fwvnXabpxkwir>fiOH5f`@vRf{CkcQCBcW{#6t zje@Rp$#;%h4`&h>lx_;h+7eMuY%>V(FX}%TzYej$-1+CB+v(ac%76prfsj=ZkFr z!>Z(9|M+UD-jyPOaTMwppa5d-S*?lw-WhtJEAGY1xgY2_ds^Pt>*KPQ96!$)D2!dp z^-N3TTh{loSYamVAe4lV9FSo*Xf`t2wyL`lKq}nllf%WgeWMA6&J zzr>Yyf4*7l^S#_8NXL?!TE&LB&@uOqnVF$J{{c7ZS_i>}QIs)Z)PU^$6!*XPL9Rq~aX1%~mJ`fIEM-qwYT#zx15j7CO(3a$Bf zCq&QY5+O6XkrE>{qNemBT@wS`pf9S|BfI;F9C%Z*N1-4dJf=47RdK@nYx?0MbVrqL zG224(F6UVuF*KmoVh}ELfANBKm?X12hZ4|NF)E}dnxj>()g5N zUrWhaB4eShA}|6o0b6Z$*q$?u{3QQvN0s!aY1kN!MV;=k&E;bYZJ+|zQUy7EYeMxx z*3liSLEww{vuj2lJT-sMwMz{zE*(fvmwWCMBZ!ep?f6*v|Jm8_D zXUZ`sRnRs@NHaEAv+wRE4S%o5v))A8JD9Vt35hdvgRuLL32P=JI6R`JZ)^;yk^mE( zy}1||n?`wwU`~hJR2VyG`{|&2yzK)18Fs32($G01j^bp|a75Pgi$}mLdX>T>ChKFt zI^1v%y+bv1@mGIPHE-N|_AMQ4zG2#cexHT6*KH?}I>~O#gNeceI{z_+{O;->SlL|6%0+Vhv5@rJ*8@bz z9)va5PBXV@ilY$5iMk!tc9J}E$y}pI8hC;%?mLftnucI7;9!YY_oo%F%(NH$?oPt` zkHoryEVv<`$l2c6EZdF;!!}`QaQex`f!Ab}Q|{SkzoT0TEuoLzDBD8fdysJwYrW@e zwMNBF?aj?}jc2cdaOM&Ivu3J3wTd!Jkp1x#AJXe5^-qZjX^j3kzf|2Jys;J;EL7en zt2eQjqgdJUsBYGUWh5wvZ3v<89>YOT>?laDJBd+GrCZxF5p=YHf9tjr;X=X~y(l?p z+|$$Z%{8flq~&_(Ii;V{nNx81#^D+a%IZMQA`Vh{tA2g)8?8?DmEX)w{{E@kpM^Y_ z)<7cDtN!7BPE%D_M2ZQfj!xAR4OcPQLu1DO9H%9PX+Hz1bqz{BcbbXeQEcrEX}o<- z?^ap%(xKb_VDRw}EH-IcEdrgRdr{2pvbwMX`#wh<*)mvp6{_3pA@%pXO2PHWQbP52 z!cbR>hX089tl|eXhwtGLiH)3Y#OiJ-N-92iK%-o}_tA*8+hxvyU4Y~k-Z^RH)#;p^RPzwt#>5UJ z=dLderBWSb)zS!yk`h$>$1q6@4sSuY{6e*768g-LH9faq&Ka9c;uH3LTw((L!Beo2 zvgQvDo9ZfDB>_PRQ-(94jEA@*Y1X@?>7wQEq9?OZq*RZeNaQesaPBZDxFhH}m}In< z7v_3_{F$+-ItXtmr`(I|N5*Bnjm-_xZKq7hohIfQ)h(Q7crNicAQ94a z3Kj+_=&VUu*rW2D&AQEGiX#q=lwD-i^?ws4-&cyE>6o7=B?e>Vl6-g6Pu)==O9z!H zZzD-$?CakDywq=h%~EiA0A6N=BUG|~R-FHiXNo9!&QHv^m@XFkQgfh8A0wXY_EUbs$ zXdwoN+Z}~Mz>z8k$rC61nJ}kV$z3Q2;jNkRwX!(5>hAtX#=?xO&8e1x7iTI0%NcrP z2TZDm(Mnb%Xd`9jr8T~qLmkHli3Tt|kN9InJwN&}2LY;(3a>KeO+98^Vf~sG?L3{T zmi0Us!?$-gNJQRNH;mMLF6N&tHp(vRBhCiZ>4ZzBij^;=EXunj_E+2u8k${p4?4{4 z%9g*Ui%fRW_h6TgLX=q&?`-acnSi+2+Iju*>8K9B$dv`_?Pa;%Cfs=AkDarnnw~E9yJKyl<+XE{!EDqovN_F zNRhB1NLd?KG&qO*$p$X?*@1bp1eQgjN473ecLIFQWXjp$S0^{Fo8eVrqKh_7eUj>_ zsPzyvu9-f@#8#3|Qr4QUT&#SGXMlo`&h~5%S2u5{0m85i~@@6~_0CHEx!kt< zfgO3VX0FvX5?9Ep)=+Hg;TBsnZ5FVnW*nHc^unXv-WvRKJ0}i!rVL;qjasE~oUCxj zcMQl&GmnxfMyznWzfX1#QmKbFDqUtYpusaw$0DC6hd?sm<+j|zvQvfXPh@HJMu7M>Ta~{ z6Uzw4`Roi=jR8~C2@KY}YDjo$+ljkBu_oyNczx?G)C7cjj5BNA z#e~Bc#;pWaFk653&aR}kTV#~35nssp@((g(BLU#`;t4bT^rjR1yZd>Fr?patb=c$j zA=dMX_06x-3<<%j;Qdfh!~;wJ;7T`)hN<64M{E#yW7KYAVA z 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 literal 0 HcmV?d00001 diff --git a/libs/mockolate/mockolate-0.12.4-flex.swc b/libs/mockolate/mockolate-0.12.4-flex.swc new file mode 100644 index 0000000000000000000000000000000000000000..3feb1c90fb226ebab9383202bb41dce883e22263 GIT binary patch literal 161099 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

*_ZbYZNO$SZ|La}jmx2z6_(%WAgV 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
GZSZxeWQ+{;d4IWb2Bkg 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 Mk9(vG^vCso0CEF#EdT%j literal 0 HcmV?d00001 diff --git a/src/BBBUnitTests-app.xml b/src/BBBUnitTests-app.xml new file mode 100644 index 0000000..b3f2e38 --- /dev/null +++ b/src/BBBUnitTests-app.xml @@ -0,0 +1,268 @@ + + + + + + + BBBUnitTests + + + BBBUnitTests + + + BBBUnitTests + + + 0.0.0 + + + + + + + + + + + + + + + + + + [This value will be overwritten by Flash Builder in the output app.xml] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + false + false + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16bit + + + + + + + + + + + + + + + + + + ]]> + + + UIDeviceFamily + + 1 + 2 + + ]]> + high + + diff --git a/src/FlexUnitApplication-app.xml b/src/FlexUnitApplication-app.xml new file mode 100644 index 0000000..3ad4a07 --- /dev/null +++ b/src/FlexUnitApplication-app.xml @@ -0,0 +1,267 @@ + + + + + + + FlexUnitApplication + + + FlexUnitApplication + + + FlexUnitApplication + + + 0.0.0 + + + + + + + + + + + + + + + + + + [This value will be overwritten by Flash Builder in the output app.xml] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16bit + + + + + + + + + + + + + + + + + + ]]> + + + UIDeviceFamily + + 1 + 2 + + ]]> + high + + diff --git a/src/FlexUnitApplication.mxml b/src/FlexUnitApplication.mxml new file mode 100644 index 0000000..67ee55d --- /dev/null +++ b/src/FlexUnitApplication.mxml @@ -0,0 +1,416 @@ + + + + + + + + + + + + diff --git a/src/FlexUnitCompilerApplication-app.xml b/src/FlexUnitCompilerApplication-app.xml new file mode 100644 index 0000000..a9e2e05 --- /dev/null +++ b/src/FlexUnitCompilerApplication-app.xml @@ -0,0 +1,267 @@ + + + + + + + FlexUnitCompilerApplication + + + FlexUnitCompilerApplication + + + FlexUnitCompilerApplication + + + 0.0.0 + + + + + + + + + + + + + + + + + + [This value will be overwritten by Flash Builder in the output app.xml] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16bit + + + + + + + + + + + + + + + + + + ]]> + + + UIDeviceFamily + + 1 + 2 + + ]]> + high + + diff --git a/src/FlexUnitCompilerApplication.mxml b/src/FlexUnitCompilerApplication.mxml new file mode 100644 index 0000000..08a3e38 --- /dev/null +++ b/src/FlexUnitCompilerApplication.mxml @@ -0,0 +1,174 @@ + + + + + + + + + + + + diff --git a/src/Main.mxml b/src/Main.mxml index 8afb750..4229d24 100644 --- a/src/Main.mxml +++ b/src/Main.mxml @@ -40,7 +40,7 @@ import org.bigbluebutton.view.navigation.pages.presentation.PresentationConfig; import org.bigbluebutton.view.navigation.pages.profile.ProfileConfig; import org.bigbluebutton.view.navigation.pages.selectparticipant.SelectParticipantConfig; - import org.bigbluebutton.view.navigation.pages.userdetails.UserDetaisConfig; + import org.bigbluebutton.view.navigation.pages.userdetails.UserDetailsConfig; import org.bigbluebutton.view.navigation.pages.videochat.VideoChatConfig; import org.bigbluebutton.view.ui.LoginButtonConfig; import org.bigbluebutton.view.ui.MicButtonConfig; @@ -109,7 +109,7 @@ .configure(ChatRoomsConfig) .configure(VideoChatConfig) .configure(ProfileConfig) - .configure(UserDetaisConfig) + .configure(UserDetailsConfig) .configure(ParticipantsConfig) .configure(SelectParticipantConfig) .configure(MicButtonConfig) diff --git a/src/bar-descriptor.xml b/src/bar-descriptor.xml new file mode 100644 index 0000000..20584af --- /dev/null +++ b/src/bar-descriptor.xml @@ -0,0 +1,40 @@ + + + + none + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/org/bigbluebutton/core/BaseConnection.as b/src/org/bigbluebutton/core/BaseConnection.as index 524afdf..43acd6b 100644 --- a/src/org/bigbluebutton/core/BaseConnection.as +++ b/src/org/bigbluebutton/core/BaseConnection.as @@ -31,7 +31,6 @@ package org.bigbluebutton.core protected var _onUserCommand:Boolean; public function BaseConnection() { - Log.getLogger("org.bigbluebutton").info(String(this)); } public function init(callback:IDefaultConnectionCallback):void diff --git a/src/org/bigbluebutton/core/BigBlueButtonConnection.as b/src/org/bigbluebutton/core/BigBlueButtonConnection.as index b4c20b9..4d835bf 100644 --- a/src/org/bigbluebutton/core/BigBlueButtonConnection.as +++ b/src/org/bigbluebutton/core/BigBlueButtonConnection.as @@ -27,7 +27,6 @@ package org.bigbluebutton.core private var _userId:String; public function BigBlueButtonConnection() { - Log.getLogger("org.bigbluebutton").info(String(this)); } [PostConstruct] diff --git a/src/org/bigbluebutton/core/DeskshareConnection.as b/src/org/bigbluebutton/core/DeskshareConnection.as index bcc09db..da4362b 100644 --- a/src/org/bigbluebutton/core/DeskshareConnection.as +++ b/src/org/bigbluebutton/core/DeskshareConnection.as @@ -32,7 +32,6 @@ package org.bigbluebutton.core public function DeskshareConnection() { - Log.getLogger("org.bigbluebutton").info(String(this)); } [PostConstruct] diff --git a/src/org/bigbluebutton/core/VideoConnection.as b/src/org/bigbluebutton/core/VideoConnection.as index d060863..8a698ec 100644 --- a/src/org/bigbluebutton/core/VideoConnection.as +++ b/src/org/bigbluebutton/core/VideoConnection.as @@ -37,7 +37,6 @@ package org.bigbluebutton.core public function VideoConnection() { - Log.getLogger("org.bigbluebutton").info(String(this)); } [PostConstruct] diff --git a/src/org/bigbluebutton/core/VoiceConnection.as b/src/org/bigbluebutton/core/VoiceConnection.as index 0308b6c..d2d3e8e 100644 --- a/src/org/bigbluebutton/core/VoiceConnection.as +++ b/src/org/bigbluebutton/core/VoiceConnection.as @@ -28,7 +28,6 @@ package org.bigbluebutton.core protected var _conferenceParameters:IConferenceParameters; public function VoiceConnection() { - Log.getLogger("org.bigbluebutton").info(String(this)); } [PostConstruct] diff --git a/src/org/bigbluebutton/core/ui/Popup.as b/src/org/bigbluebutton/core/ui/Popup.as deleted file mode 100644 index 44bfb06..0000000 --- a/src/org/bigbluebutton/core/ui/Popup.as +++ /dev/null @@ -1,50 +0,0 @@ -package org.bigbluebutton.core.ui -{ - import flash.display.DisplayObject; - import flash.display.DisplayObjectContainer; - - import mx.core.FlexGlobals; - import mx.core.UIComponent; - import mx.managers.PopUpManager; - - import org.bigbluebutton.core.ui.api.IPopup; - import org.bigbluebutton.core.view.IView; - - import robotlegs.bender.extensions.viewManager.api.IViewManager; - - import spark.components.Application; - - - /** - * Wrapper class for the PopUpManager that - * improves the testability of the desig.n - */ - public class Popup implements IPopup - { - [Inject] - public var viewManager: IViewManager; - - /** - * Presents the view as a popup. - */ - public function add(view: IView): void - { - viewManager.addContainer(view as DisplayObjectContainer); - - try { - PopUpManager.addPopUp(view as UIComponent, FlexGlobals.topLevelApplication as DisplayObject, true); - PopUpManager.centerPopUp(view as UIComponent); - } catch (err: Error) { } - } - - /** - * Removes view from being a popup. - */ - public function remove(view: IView): void - { - PopUpManager.removePopUp(view as UIComponent); - - viewManager.removeContainer(view as DisplayObjectContainer); - } - } -} \ No newline at end of file diff --git a/src/org/bigbluebutton/core/ui/api/IPopup.as b/src/org/bigbluebutton/core/ui/api/IPopup.as deleted file mode 100644 index df8aa9c..0000000 --- a/src/org/bigbluebutton/core/ui/api/IPopup.as +++ /dev/null @@ -1,12 +0,0 @@ -package org.bigbluebutton.core.ui.api -{ - import flash.display.DisplayObject; - - import org.bigbluebutton.core.view.IView; - - public interface IPopup - { - function add(view: IView): void; - function remove(view: IView): void; - } -} \ No newline at end of file diff --git a/src/org/bigbluebutton/view/navigation/PagesNavigatorViewMediator.as b/src/org/bigbluebutton/view/navigation/PagesNavigatorViewMediator.as index cadaf4b..219a226 100644 --- a/src/org/bigbluebutton/view/navigation/PagesNavigatorViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/PagesNavigatorViewMediator.as @@ -93,6 +93,8 @@ package org.bigbluebutton.view.navigation override public function destroy():void { + userUISession.pageChangedSignal.remove(changePage); + super.destroy(); view.dispose(); diff --git a/src/org/bigbluebutton/view/navigation/pages/PagesENUM.as b/src/org/bigbluebutton/view/navigation/pages/PagesENUM.as index 6a18fff..04fdac0 100644 --- a/src/org/bigbluebutton/view/navigation/pages/PagesENUM.as +++ b/src/org/bigbluebutton/view/navigation/pages/PagesENUM.as @@ -10,7 +10,7 @@ package org.bigbluebutton.view.navigation.pages import org.bigbluebutton.view.navigation.pages.presentation.PresentationView; import org.bigbluebutton.view.navigation.pages.profile.ProfileView; import org.bigbluebutton.view.navigation.pages.selectparticipant.SelectParticipantView; - import org.bigbluebutton.view.navigation.pages.userdetails.UserDetaisView; + import org.bigbluebutton.view.navigation.pages.userdetails.UserDetailsView; import org.bigbluebutton.view.navigation.pages.videochat.VideoChatView; import org.bigbluebutton.view.navigation.pages.deskshare.DeskshareView; @@ -40,7 +40,7 @@ package org.bigbluebutton.view.navigation.pages dic[PRESENTATION] = PresentationView; dic[LOGIN] = LoginPageView; dic[PROFILE] = ProfileView; - dic[USER_DETAIS] = UserDetaisView; + dic[USER_DETAIS] = UserDetailsView; dic[VIDEO_CHAT] = VideoChatView; dic[CHATROOMS] = ChatRoomsView; dic[CHAT] = ChatView; diff --git a/src/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediator.as index 1e507b4..4718fb6 100644 --- a/src/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediator.as @@ -46,11 +46,12 @@ package org.bigbluebutton.view.navigation.pages.chat protected var dataProvider:ArrayCollection; protected var usersSignal:ISignal; - protected var list:List; protected var publicChat:Boolean = true; protected var user:User; protected var data:Object; + internal var list:List; + override public function initialize():void { Log.getLogger("org.bigbluebutton").info(String(this)); diff --git a/src/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediator.as index 7155c52..7efe7d5 100644 --- a/src/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediator.as @@ -45,12 +45,13 @@ package org.bigbluebutton.view.navigation.pages.chatrooms public var userUISession: IUserUISession; protected var dataProvider:ArrayCollection; protected var usersSignal:ISignal; - protected var list:List; protected var dicUsertoChat:Dictionary; protected var button:Object; + internal var list:List; + private var _users:ArrayCollection; private var _usersAdded:Array = new Array(); diff --git a/src/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewMediator.as index c3391f4..a6f06d5 100644 --- a/src/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewMediator.as @@ -32,6 +32,8 @@ package org.bigbluebutton.view.navigation.pages.common public override function destroy():void { userSession.deskshareConnection.isStreamingSignal.remove(onDeskshareStreamChange); + + view = null; } } } \ No newline at end of file diff --git a/src/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewMediator.as index 05fc0c9..090d85a 100644 --- a/src/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewMediator.as @@ -70,6 +70,7 @@ package org.bigbluebutton.view.navigation.pages.deskshare userSession.deskshareConnection.isStreamingSignal.remove(onDeskshareStreamChange); userSession.deskshareConnection.mouseLocationChangedSignal.remove(onMouseLocationChanged); view.stopStream(); + view = null; } } } \ No newline at end of file diff --git a/src/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewMediator.as index 832b063..af83877 100644 --- a/src/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewMediator.as @@ -51,5 +51,10 @@ package org.bigbluebutton.view.navigation.pages.disconnect trace("DisconnectPageViewMediator.applicationExit - exitting the application!"); NativeApplication.nativeApplication.exit(); } + + override public function destroy():void + { + view = null; + } } } \ No newline at end of file diff --git a/src/org/bigbluebutton/view/navigation/pages/login/LoginPageViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/login/LoginPageViewMediator.as index 6c1b4e7..3734d06 100644 --- a/src/org/bigbluebutton/view/navigation/pages/login/LoginPageViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/pages/login/LoginPageViewMediator.as @@ -78,7 +78,7 @@ package org.bigbluebutton.view.navigation.pages.login if(Capabilities.isDebugger) { // test-install server no longer works with 0.9 mobile client - + //url = "bigbluebutton://test-install.blindsidenetworks.com/bigbluebutton/api/join?fullName=Air&meetingID=Demo+Meeting&password=ap&checksum=512620179852dadd6fe0665a48bcb852a3c0afac"; //url = "bigbluebutton://lab1.mconf.org/bigbluebutton/api/join?fullName=Air+client&meetingID=Test+room+4&password=prof123&checksum=5805753edd08fbf9af50f9c28bb676c7e5241349" } diff --git a/src/org/bigbluebutton/view/navigation/pages/participants/ParticipantItemRenderer.mxml b/src/org/bigbluebutton/view/navigation/pages/participants/ParticipantItemRenderer.mxml index 637529a..2f37ce3 100644 --- a/src/org/bigbluebutton/view/navigation/pages/participants/ParticipantItemRenderer.mxml +++ b/src/org/bigbluebutton/view/navigation/pages/participants/ParticipantItemRenderer.mxml @@ -47,7 +47,7 @@ + textAlign="left" verticalAlign="middle"/> diff --git a/src/org/bigbluebutton/view/navigation/pages/participants/UserButton.as b/src/org/bigbluebutton/view/navigation/pages/participants/UserButton.as deleted file mode 100644 index eb70ab5..0000000 --- a/src/org/bigbluebutton/view/navigation/pages/participants/UserButton.as +++ /dev/null @@ -1,12 +0,0 @@ -package org.bigbluebutton.view.navigation.pages.participants -{ - import org.bigbluebutton.model.User; - - public class UserButton extends User - { - public function UserButton():void - { - - } - } -} \ No newline at end of file diff --git a/src/org/bigbluebutton/view/navigation/pages/userdetails/IUserDetaisView.as b/src/org/bigbluebutton/view/navigation/pages/userdetails/IUserDetailsView.as similarity index 87% rename from src/org/bigbluebutton/view/navigation/pages/userdetails/IUserDetaisView.as rename to src/org/bigbluebutton/view/navigation/pages/userdetails/IUserDetailsView.as index af71d0d..3231805 100644 --- a/src/org/bigbluebutton/view/navigation/pages/userdetails/IUserDetaisView.as +++ b/src/org/bigbluebutton/view/navigation/pages/userdetails/IUserDetailsView.as @@ -5,7 +5,7 @@ package org.bigbluebutton.view.navigation.pages.userdetails import spark.components.Button; - public interface IUserDetaisView extends IView + public interface IUserDetailsView extends IView { function set user(u:User):void function get user():User diff --git a/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetaisConfig.as b/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsConfig.as similarity index 89% rename from src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetaisConfig.as rename to src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsConfig.as index 9288c4c..71a7216 100644 --- a/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetaisConfig.as +++ b/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsConfig.as @@ -7,7 +7,7 @@ package org.bigbluebutton.view.navigation.pages.userdetails import robotlegs.bender.framework.api.IInjector; - public class UserDetaisConfig implements IConfig + public class UserDetailsConfig implements IConfig { [Inject] public var injector: IInjector; @@ -40,7 +40,7 @@ package org.bigbluebutton.view.navigation.pages.userdetails */ private function mediators(): void { - mediatorMap.map(IUserDetaisView).toMediator(UserDetaisViewMediator); + mediatorMap.map(IUserDetailsView).toMediator(UserDetailsViewMediator); } /** diff --git a/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetaisView.as b/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsView.as similarity index 91% rename from src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetaisView.as rename to src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsView.as index 0e9e9e3..006d8ca 100644 --- a/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetaisView.as +++ b/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsView.as @@ -6,9 +6,9 @@ package org.bigbluebutton.view.navigation.pages.userdetails import spark.components.Button; - public class UserDetaisView extends UserDetaisViewBase implements IUserDetaisView + public class UserDetailsView extends UserDetailsViewBase implements IUserDetailsView { - public function UserDetaisView():void + public function UserDetailsView():void { } diff --git a/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetaisViewBase.mxml b/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewBase.mxml similarity index 100% rename from src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetaisViewBase.mxml rename to src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewBase.mxml diff --git a/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetaisViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewMediator.as similarity index 95% rename from src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetaisViewMediator.as rename to src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewMediator.as index a145c2b..ea3a4b3 100644 --- a/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetaisViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewMediator.as @@ -14,10 +14,10 @@ package org.bigbluebutton.view.navigation.pages.userdetails import robotlegs.bender.bundles.mvcs.Mediator; - public class UserDetaisViewMediator extends Mediator + public class UserDetailsViewMediator extends Mediator { [Inject] - public var view: IUserDetaisView; + public var view: IUserDetailsView; [Inject] public var userSession: IUserSession; diff --git a/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as index 08fadbf..cc926c8 100644 --- a/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as @@ -11,7 +11,6 @@ package org.bigbluebutton.view.navigation.pages.videochat import org.bigbluebutton.model.UserList; import org.bigbluebutton.model.UserSession; import org.bigbluebutton.view.navigation.pages.PagesENUM; - import org.mockito.integrations.currentMockito; import org.osmf.logging.Log; import robotlegs.bender.bundles.mvcs.Mediator; diff --git a/tests/org/bigbluebutton/AppConfigTest.as b/tests/org/bigbluebutton/AppConfigTest.as new file mode 100644 index 0000000..1cf1753 --- /dev/null +++ b/tests/org/bigbluebutton/AppConfigTest.as @@ -0,0 +1,71 @@ +package org.bigbluebutton +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.command.MicrophoneMuteSignal; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.commandCenter.dsl.ICommandMapper; + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class AppConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:AppConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, ISignalCommandMap), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new AppConfig(); + + instance.injector = this.injector; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfAppConfig():void + { + assertTrue("instance is AppConfig", instance is AppConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/AppConfigurationTests.as b/tests/org/bigbluebutton/AppConfigurationTests.as deleted file mode 100644 index 805633f..0000000 --- a/tests/org/bigbluebutton/AppConfigurationTests.as +++ /dev/null @@ -1,19 +0,0 @@ -package org.bigbluebutton -{ - import org.hamcrest.assertThat; - import org.hamcrest.object.notNullValue; - - import robotlegs.bender.framework.api.IConfig; - - public class AppConfigurationTests - { - /** - * Tests that the AppConfiguration implements IConfig. - */ - [Test] - public function implements_expectedInterface(): void - { - assertThat(new AppConfig() as IConfig, notNullValue()); - } - } -} \ No newline at end of file diff --git a/tests/org/bigbluebutton/AppTestSuite.as b/tests/org/bigbluebutton/AppTestSuite.as deleted file mode 100644 index 93efb5c..0000000 --- a/tests/org/bigbluebutton/AppTestSuite.as +++ /dev/null @@ -1,9 +0,0 @@ -package org.bigbluebutton -{ - [Suite] - [RunWith("org.flexunit.runners.Suite")] - public class AppTestSuite - { - - } -} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/CameraQualityCommandTest.as b/tests/org/bigbluebutton/command/CameraQualityCommandTest.as new file mode 100644 index 0000000..402170f --- /dev/null +++ b/tests/org/bigbluebutton/command/CameraQualityCommandTest.as @@ -0,0 +1,93 @@ +package org.bigbluebutton.command +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.core.VideoConnection; + import org.bigbluebutton.model.UserSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.bundles.mvcs.Command; + + public class CameraQualityCommandTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var videoConnection:VideoConnection; + + [Mock] + public var userSession:UserSession; + + private static var TIMEOUT:Number = 5000; + + protected var instance:CameraQualityCommand; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(VideoConnection), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new CameraQualityCommand(); + instance.userSession = userSession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfCameraQualityCommand():void + { + assertTrue("instance is CameraQualityCommand", instance is CameraQualityCommand); + } + + [Test] + public function instantiated_implementsRobotlegsCommand():void + { + assertTrue("instance is robotlegs Command", instance is Command); + } + + [Test] + public function executed_callsSelectCameraQualityMethod():void + { + // arrange + stub(instance.userSession).getter("videoConnection").returns(videoConnection); + + // act + instance.execute(); + + // assert + assertThat(instance.userSession.videoConnection, received().method('selectCameraQuality')); + } + + [Test] + public function executed_callsSelectCameraQualityMethodWithCorrectArgs():void + { + // arrange + instance.cameraQualitySelected = 2; + instance.userSession = userSession; + stub(instance.userSession).getter("videoConnection").returns(videoConnection); + + // act + instance.execute(); + + // assert + assertThat(instance.userSession.videoConnection, received().method('selectCameraQuality').arg(2)); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/CameraQualitySignalTest.as b/tests/org/bigbluebutton/command/CameraQualitySignalTest.as new file mode 100644 index 0000000..5d12954 --- /dev/null +++ b/tests/org/bigbluebutton/command/CameraQualitySignalTest.as @@ -0,0 +1,36 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + import robotlegs.bender.bundles.mvcs.Command; + + public class CameraQualitySignalTest + { + protected var instance:CameraQualitySignal; + + [Before] + public function setUp():void + { + instance = new CameraQualitySignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfCameraQualitySignal():void + { + assertTrue("instance is CameraQualitySignal", instance is CameraQualitySignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/ConnectCommandTest.as b/tests/org/bigbluebutton/command/ConnectCommandTest.as new file mode 100644 index 0000000..4d2eedd --- /dev/null +++ b/tests/org/bigbluebutton/command/ConnectCommandTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + + import robotlegs.bender.bundles.mvcs.Command; + + public class ConnectCommandTest + { + protected var instance:ConnectCommand; + + [Before] + public function setUp():void + { + instance = new ConnectCommand(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfConnectCommand():void + { + assertTrue("instance is ConnectCommand", instance is ConnectCommand); + } + + [Test] + public function instantiated_implementsRobotlegsCommand():void + { + assertTrue("instance is robotlegs Command", instance is Command); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/ConnectSignalTest.as b/tests/org/bigbluebutton/command/ConnectSignalTest.as new file mode 100644 index 0000000..9917e8f --- /dev/null +++ b/tests/org/bigbluebutton/command/ConnectSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class ConnectSignalTest + { + protected var instance:ConnectSignal; + + [Before] + public function setUp():void + { + instance = new ConnectSignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfConnectSignal():void + { + assertTrue("instance is ConnectSignal", instance is ConnectSignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/DisconnectUserCommandTest.as b/tests/org/bigbluebutton/command/DisconnectUserCommandTest.as new file mode 100644 index 0000000..34b889f --- /dev/null +++ b/tests/org/bigbluebutton/command/DisconnectUserCommandTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + + import robotlegs.bender.bundles.mvcs.Command; + + public class DisconnectUserCommandTest + { + protected var instance:DisconnectUserCommand; + + [Before] + public function setUp():void + { + instance = new DisconnectUserCommand(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDisconnectUserCommand():void + { + assertTrue("instance is DisconnectUserCommand", instance is DisconnectUserCommand); + } + + [Test] + public function instantiated_implementsRobotlegsCommand():void + { + assertTrue("instance is robotlegs Command", instance is Command); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/DisconnectUserSignalTest.as b/tests/org/bigbluebutton/command/DisconnectUserSignalTest.as new file mode 100644 index 0000000..ecb9f29 --- /dev/null +++ b/tests/org/bigbluebutton/command/DisconnectUserSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class DisconnectUserSignalTest + { + protected var instance:DisconnectUserSignal; + + [Before] + public function setUp():void + { + instance = new DisconnectUserSignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDisconnectUserSignal():void + { + assertTrue("instance is DisconnectUserSignal", instance is DisconnectUserSignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/JoinMeetingCommandTest.as b/tests/org/bigbluebutton/command/JoinMeetingCommandTest.as new file mode 100644 index 0000000..d32a811 --- /dev/null +++ b/tests/org/bigbluebutton/command/JoinMeetingCommandTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + + import robotlegs.bender.bundles.mvcs.Command; + + public class JoinMeetingCommandTest + { + protected var instance:JoinMeetingCommand; + + [Before] + public function setUp():void + { + instance = new JoinMeetingCommand(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfJoinMeetingCommand():void + { + assertTrue("instance is JoinMeetingCommand", instance is JoinMeetingCommand); + } + + [Test] + public function instantiated_implementsRobotlegsCommand():void + { + assertTrue("instance is robotlegs Command", instance is Command); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/JoinMeetingSignalTest.as b/tests/org/bigbluebutton/command/JoinMeetingSignalTest.as new file mode 100644 index 0000000..d749949 --- /dev/null +++ b/tests/org/bigbluebutton/command/JoinMeetingSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class JoinMeetingSignalTest + { + protected var instance:JoinMeetingSignal; + + [Before] + public function setUp():void + { + instance = new JoinMeetingSignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfJoinMeetingSignal():void + { + assertTrue("instance is JoinMeetingSignal", instance is JoinMeetingSignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/LoadSlideCommandTest.as b/tests/org/bigbluebutton/command/LoadSlideCommandTest.as new file mode 100644 index 0000000..fd7a1e3 --- /dev/null +++ b/tests/org/bigbluebutton/command/LoadSlideCommandTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + + import robotlegs.bender.bundles.mvcs.Command; + + public class LoadSlideCommandTest + { + protected var instance:LoadSlideCommand; + + [Before] + public function setUp():void + { + instance = new LoadSlideCommand(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoadSlideCommand():void + { + assertTrue("instance is LoadSlideCommand", instance is LoadSlideCommand); + } + + [Test] + public function instantiated_implementsRobotlegsCommand():void + { + assertTrue("instance is robotlegs Command", instance is Command); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/LoadSlideSignalTest.as b/tests/org/bigbluebutton/command/LoadSlideSignalTest.as new file mode 100644 index 0000000..31413cb --- /dev/null +++ b/tests/org/bigbluebutton/command/LoadSlideSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class LoadSlideSignalTest + { + protected var instance:LoadSlideSignal; + + [Before] + public function setUp():void + { + instance = new LoadSlideSignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoadSlideSignal():void + { + assertTrue("instance is LoadSlideSignal", instance is LoadSlideSignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/MicrophoneEnableCommandTests.as b/tests/org/bigbluebutton/command/MicrophoneEnableCommandTests.as deleted file mode 100644 index cd2a680..0000000 --- a/tests/org/bigbluebutton/command/MicrophoneEnableCommandTests.as +++ /dev/null @@ -1,132 +0,0 @@ -package org.bigbluebutton.command -{ - import flashx.textLayout.debug.assert; - - import org.flexunit.assertThat; - import org.flexunit.asserts.assertFalse; - import org.flexunit.asserts.assertTrue; - import org.hamcrest.object.equalTo; - import org.bigbluebutton.model.IUserSettings; - import org.bigbluebutton.view.ui.IMicButton; - import org.bigbluebutton.view.ui.MicButton; - import org.mockito.integrations.flexunit4.MockitoRule; - import org.mockito.integrations.havingPropertyOf; - import org.mockito.integrations.mock; - import org.mockito.integrations.times; - import org.mockito.integrations.verify; - - [Mock(type="org.bigbluebutton.model.IUserSettings")] - public class MicrophoneEnableCommandTests - { - [Rule] - public var mockitoRule: MockitoRule = new MockitoRule(); - - /** - * Tests that the command microphoneEnabledOff really change/mantain the variable "selected" in the button false - */ - [Test] - public function execute_microphoneEnabledOffAndCheckSelectedProperty(): void - { - var micButton:MicButton = new MicButton(); - - var command: MicrophoneOnCommand = createCommand(); - command.enabled = false; - command.execute(); - - assertFalse(micButton.selected); - } - - /** - * Tests that the command microphoneEnabledOff really change the visual in the button to desabled - */ - [Test] - public function execute_microphoneEnabledOffAndCheckSelectedState(): void - { - var micButton:MicButton = new MicButton(); - - var command: MicrophoneOnCommand = createCommand(); - command.enabled = false; - command.execute(); - - assertThat(micButton.currentState, equalTo("unselected")); - } - - /** - * Tests that the command microphoneEnabledOn really change the variable "selected" in the button - */ - [Test] - public function execute_microphoneEnabledOnAndCheckSelectedProperty(): void - { - var micButton:MicButton = new MicButton(); - - var command: MicrophoneOnCommand = createCommand(); - command.enabled = true; - command.execute(); - - assertTrue(micButton.selected); - } - - /** - * Tests that the command microphoneEnabledOn really change the visual in the button - */ - [Test] - public function execute_microphoneEnabledOnAndCheckSelectedState(): void - { - var micButton:MicButton = new MicButton(); - - var command: MicrophoneOnCommand = createCommand(); - command.enabled = true; - command.execute(); - - assertThat(micButton.currentState, equalTo("selected")); - } - - /** - * Tests that the command to enable after the disable works - */ - [Test] - public function execute_microphoneEnabledOnThenOffAndCheckIfOff(): void - { - var micButton:MicButton = new MicButton(); - - var command: MicrophoneOnCommand = createCommand(); - command.enabled = true; - command.execute(); - - var command1: MicrophoneOnCommand = createCommand(); - command1.enabled = false; - command1.execute(); - - assertFalse(micButton.selected); - } - - /** - * Tests that the command to enable after the disable works - */ - [Test] - public function execute_microphoneEnabledOffThenOnAndCheckIfOn(): void - { - var micButton:MicButton = new MicButton(); - - var command: MicrophoneOnCommand = createCommand(); - command.enabled = false; - command.execute(); - - var command1: MicrophoneOnCommand = createCommand(); - command1.enabled = true; - command1.execute(); - - assertTrue(micButton.selected); - } - - /** - * Creates the test subject with its dependencies. - */ - private function createCommand(): MicrophoneOnCommand - { - var command: MicrophoneOnCommand = new MicrophoneOnCommand(); - command.userSettings = mock(IUserSettings); - return command; - } - } -} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/MicrophoneEnableSignalTests.as b/tests/org/bigbluebutton/command/MicrophoneEnableSignalTests.as deleted file mode 100644 index 6903ecb..0000000 --- a/tests/org/bigbluebutton/command/MicrophoneEnableSignalTests.as +++ /dev/null @@ -1,17 +0,0 @@ -package org.bigbluebutton.command -{ - import org.hamcrest.assertThat; - import org.hamcrest.object.equalTo; - - public class MicrophoneEnableSignalTests - { - /** - * TurnOffMicSignal should not have an argument. - */ - [Test] - public function default_ShouldHaveStringAsArg(): void - { - assertThat(new MicrophoneOnSignal().valueClasses.length, equalTo(2)); - } - } -} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/MicrophoneMuteCommandTest.as b/tests/org/bigbluebutton/command/MicrophoneMuteCommandTest.as new file mode 100644 index 0000000..507433a --- /dev/null +++ b/tests/org/bigbluebutton/command/MicrophoneMuteCommandTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + + import robotlegs.bender.bundles.mvcs.Command; + + public class MicrophoneMuteCommandTest + { + protected var instance:MicrophoneMuteCommand; + + [Before] + public function setUp():void + { + instance = new MicrophoneMuteCommand(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMicrophoneMuteCommand():void + { + assertTrue("instance is MicrophoneMuteCommand", instance is MicrophoneMuteCommand); + } + + [Test] + public function instantiated_implementsRobotlegsCommand():void + { + assertTrue("instance is robotlegs Command", instance is Command); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/MicrophoneMuteSignalTest.as b/tests/org/bigbluebutton/command/MicrophoneMuteSignalTest.as new file mode 100644 index 0000000..6666241 --- /dev/null +++ b/tests/org/bigbluebutton/command/MicrophoneMuteSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class MicrophoneMuteSignalTest + { + protected var instance:MicrophoneMuteSignal; + + [Before] + public function setUp():void + { + instance = new MicrophoneMuteSignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMicrophoneMuteSignal():void + { + assertTrue("instance is MicrophoneMuteSignal", instance is MicrophoneMuteSignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/NavigateToCommandTest.as b/tests/org/bigbluebutton/command/NavigateToCommandTest.as new file mode 100644 index 0000000..777f30a --- /dev/null +++ b/tests/org/bigbluebutton/command/NavigateToCommandTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + + import robotlegs.bender.bundles.mvcs.Command; + + public class NavigateToCommandTest + { + protected var instance:NavigateToCommand; + + [Before] + public function setUp():void + { + instance = new NavigateToCommand(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfNavigateToCommand():void + { + assertTrue("instance is NavigateToCommand", instance is NavigateToCommand); + } + + [Test] + public function instantiated_implementsRobotlegsCommand():void + { + assertTrue("instance is robotlegs Command", instance is Command); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/NavigateToSignalTest.as b/tests/org/bigbluebutton/command/NavigateToSignalTest.as new file mode 100644 index 0000000..753ee33 --- /dev/null +++ b/tests/org/bigbluebutton/command/NavigateToSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class NavigateToSignalTest + { + protected var instance:NavigateToSignal; + + [Before] + public function setUp():void + { + instance = new NavigateToSignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfNavigateToSignal():void + { + assertTrue("instance is NavigateToSignal", instance is NavigateToSignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/PlayAudioStreamSignalTest.as b/tests/org/bigbluebutton/command/PlayAudioStreamSignalTest.as new file mode 100644 index 0000000..77630da --- /dev/null +++ b/tests/org/bigbluebutton/command/PlayAudioStreamSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class PlayAudioStreamSignalTest + { + protected var instance:PlayAudioStreamSignal; + + [Before] + public function setUp():void + { + instance = new PlayAudioStreamSignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPlayAudioStreamSignal():void + { + assertTrue("instance is PlayAudioStreamSignal", instance is PlayAudioStreamSignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/PublicChatMessageSignalTest.as b/tests/org/bigbluebutton/command/PublicChatMessageSignalTest.as new file mode 100644 index 0000000..eb7fcf7 --- /dev/null +++ b/tests/org/bigbluebutton/command/PublicChatMessageSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class PublicChatMessageSignalTest + { + protected var instance:PublicChatMessage; + + [Before] + public function setUp():void + { + instance = new PublicChatMessage(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPublicChatMessage():void + { + assertTrue("instance is PublicChatMessage", instance is PublicChatMessage); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/PublishAudioStreamSignalTest.as b/tests/org/bigbluebutton/command/PublishAudioStreamSignalTest.as new file mode 100644 index 0000000..0b98370 --- /dev/null +++ b/tests/org/bigbluebutton/command/PublishAudioStreamSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class PublishAudioStreamSignalTest + { + protected var instance:PublishAudioStreamSignal; + + [Before] + public function setUp():void + { + instance = new PublishAudioStreamSignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPublishAudioStreamSignal():void + { + assertTrue("instance is PublishAudioStreamSignal", instance is PublishAudioStreamSignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/RaiseHandCommandTest.as b/tests/org/bigbluebutton/command/RaiseHandCommandTest.as new file mode 100644 index 0000000..405772b --- /dev/null +++ b/tests/org/bigbluebutton/command/RaiseHandCommandTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + + import robotlegs.bender.bundles.mvcs.Command; + + public class RaiseHandCommandTest + { + protected var instance:RaiseHandCommand; + + [Before] + public function setUp():void + { + instance = new RaiseHandCommand(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfRaiseHandCommand():void + { + assertTrue("instance is RaiseHandCommand", instance is RaiseHandCommand); + } + + [Test] + public function instantiated_implementsRobotlegsCommand():void + { + assertTrue("instance is robotlegs Command", instance is Command); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/RaiseHandSignalTest.as b/tests/org/bigbluebutton/command/RaiseHandSignalTest.as new file mode 100644 index 0000000..763fb29 --- /dev/null +++ b/tests/org/bigbluebutton/command/RaiseHandSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class RaiseHandSignalTest + { + protected var instance:RaiseHandSignal; + + [Before] + public function setUp():void + { + instance = new RaiseHandSignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfRaiseHandSignal():void + { + assertTrue("instance is RaiseHandSignal", instance is RaiseHandSignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/RemovePageCommandTest.as b/tests/org/bigbluebutton/command/RemovePageCommandTest.as new file mode 100644 index 0000000..e83e524 --- /dev/null +++ b/tests/org/bigbluebutton/command/RemovePageCommandTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + + import robotlegs.bender.bundles.mvcs.Command; + + public class RemovePageCommandTest + { + protected var instance:RemovePageCommand; + + [Before] + public function setUp():void + { + instance = new RemovePageCommand(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfRemovePageCommand():void + { + assertTrue("instance is RemovePageCommand", instance is RemovePageCommand); + } + + [Test] + public function instantiated_implementsRobotlegsCommand():void + { + assertTrue("instance is robotlegs Command", instance is Command); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/ShareCameraCommandTest.as b/tests/org/bigbluebutton/command/ShareCameraCommandTest.as new file mode 100644 index 0000000..921b089 --- /dev/null +++ b/tests/org/bigbluebutton/command/ShareCameraCommandTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + + import robotlegs.bender.bundles.mvcs.Command; + + public class ShareCameraCommandTest + { + protected var instance:ShareCameraCommand; + + [Before] + public function setUp():void + { + instance = new ShareCameraCommand(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfShareCameraCommand():void + { + assertTrue("instance is ShareCameraCommand", instance is ShareCameraCommand); + } + + [Test] + public function instantiated_implementsRobotlegsCommand():void + { + assertTrue("instance is robotlegs Command", instance is Command); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/ShareCameraSignalTest.as b/tests/org/bigbluebutton/command/ShareCameraSignalTest.as new file mode 100644 index 0000000..985eebf --- /dev/null +++ b/tests/org/bigbluebutton/command/ShareCameraSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class ShareCameraSignalTest + { + protected var instance:ShareCameraSignal; + + [Before] + public function setUp():void + { + instance = new ShareCameraSignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfShareCameraSignal():void + { + assertTrue("instance is ShareCameraSignal", instance is ShareCameraSignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/ShareMicrophoneCommandTest.as b/tests/org/bigbluebutton/command/ShareMicrophoneCommandTest.as new file mode 100644 index 0000000..1cf1876 --- /dev/null +++ b/tests/org/bigbluebutton/command/ShareMicrophoneCommandTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + + import robotlegs.bender.bundles.mvcs.Command; + + public class ShareMicrophoneCommandTest + { + protected var instance:ShareMicrophoneCommand; + + [Before] + public function setUp():void + { + instance = new ShareMicrophoneCommand(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfShareCameraCommand():void + { + assertTrue("instance is ShareMicrophoneCommand", instance is ShareMicrophoneCommand); + } + + [Test] + public function instantiated_implementsRobotlegsCommand():void + { + assertTrue("instance is robotlegs Command", instance is Command); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/ShareMicrophoneSignalTest.as b/tests/org/bigbluebutton/command/ShareMicrophoneSignalTest.as new file mode 100644 index 0000000..5b7b2cc --- /dev/null +++ b/tests/org/bigbluebutton/command/ShareMicrophoneSignalTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.command +{ + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.ISignal; + + public class ShareMicrophoneSignalTest + { + protected var instance:ShareMicrophoneSignal; + + [Before] + public function setUp():void + { + instance = new ShareMicrophoneSignal(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfShareMicrophoneSignal():void + { + assertTrue("instance is ShareMicrophoneSignall", instance is ShareMicrophoneSignal); + } + + [Test] + public function instantiated_implementsISignal():void + { + assertTrue("instance implements ISignal", instance is ISignal); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/BaseConnectionTest.as b/tests/org/bigbluebutton/core/BaseConnectionTest.as new file mode 100644 index 0000000..db8fb1c --- /dev/null +++ b/tests/org/bigbluebutton/core/BaseConnectionTest.as @@ -0,0 +1,33 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class BaseConnectionTest + { + protected var instance:BaseConnection; + + [Before] + public function setUp():void + { + instance = new BaseConnection(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfBaseConnection():void + { + assertTrue("instance is BaseConnection", instance is BaseConnection); + } + + [Test] + public function instantiated_implementsIBaseConnectionInterface():void + { + assertTrue("instance implements IBaseConnection interface", instance is IBaseConnection); + } + } +} diff --git a/tests/org/bigbluebutton/core/BigBlueButtonConnectionTest.as b/tests/org/bigbluebutton/core/BigBlueButtonConnectionTest.as new file mode 100644 index 0000000..202346d --- /dev/null +++ b/tests/org/bigbluebutton/core/BigBlueButtonConnectionTest.as @@ -0,0 +1,39 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class BigBlueButtonConnectionTest + { + protected var instance:BigBlueButtonConnection; + + [Before] + public function setUp():void + { + instance = new BigBlueButtonConnection(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfBigBlueButtonConnection():void + { + assertTrue("instance is BigBlueButtonConnection", instance is BigBlueButtonConnection); + } + + [Test] + public function instantiated_implementsIBigBlueButtonConnectionInterface():void + { + assertTrue("instance implements IBigBlueButtonConnection interface", instance is IBigBlueButtonConnection); + } + + [Test] + public function instantiated_extendsDefaultConnectionCallback():void + { + assertTrue("instance extends DefaultConnectionCallback", instance is DefaultConnectionCallback); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/ChatMessageReceiverTest.as b/tests/org/bigbluebutton/core/ChatMessageReceiverTest.as new file mode 100644 index 0000000..b652e69 --- /dev/null +++ b/tests/org/bigbluebutton/core/ChatMessageReceiverTest.as @@ -0,0 +1,60 @@ +package org.bigbluebutton.core +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + + import org.bigbluebutton.model.IMessageListener; + import org.bigbluebutton.model.UserSession; + import org.bigbluebutton.model.chat.ChatMessagesSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + + public class ChatMessageReceiverTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var userSession:UserSession; + + [Mock] + public var chatMessagesSession:ChatMessagesSession; + + private static var TIMEOUT:Number = 5000; + + protected var instance:ChatMessageReceiver; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(UserSession, ChatMessagesSession), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new ChatMessageReceiver(userSession, chatMessagesSession); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatMessageReceiver():void + { + assertTrue("instance is ChatMessageReceiver", instance is ChatMessageReceiver); + } + + [Test] + public function instantiated_implementsIMessageListenerInterface():void + { + assertTrue("instance implements IMessageListener interface", instance is IMessageListener); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/ChatMessageSenderTest.as b/tests/org/bigbluebutton/core/ChatMessageSenderTest.as new file mode 100644 index 0000000..3f67a4f --- /dev/null +++ b/tests/org/bigbluebutton/core/ChatMessageSenderTest.as @@ -0,0 +1,56 @@ +package org.bigbluebutton.core +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + + import org.bigbluebutton.model.UserSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + public class ChatMessageSenderTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var userSession:UserSession; + + [Mock] + public var successSendMessageSignal:Signal; + + [Mock] + public var failureSendingMessageSignal:Signal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:ChatMessageSender; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(UserSession, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new ChatMessageSender(userSession, successSendMessageSignal, failureSendingMessageSignal); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatMessageSender():void + { + assertTrue("instance is ChatMessageSender", instance is ChatMessageSender); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/ChatMessageServiceTest.as b/tests/org/bigbluebutton/core/ChatMessageServiceTest.as new file mode 100644 index 0000000..2ce7a43 --- /dev/null +++ b/tests/org/bigbluebutton/core/ChatMessageServiceTest.as @@ -0,0 +1,33 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class ChatMessageServiceTest + { + protected var instance:ChatMessageService; + + [Before] + public function setUp():void + { + instance = new ChatMessageService(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatMessageService():void + { + assertTrue("instance is ChatMessageService", instance is ChatMessageService); + } + + [Test] + public function instantiated_implementsIChatMessageServiceInterface():void + { + assertTrue("instance implements IChatMessageService interface", instance is IChatMessageService); + } + } +} diff --git a/tests/org/bigbluebutton/core/ConfigServiceTest.as b/tests/org/bigbluebutton/core/ConfigServiceTest.as new file mode 100644 index 0000000..5794351 --- /dev/null +++ b/tests/org/bigbluebutton/core/ConfigServiceTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class ConfigServiceTest + { + protected var instance:ConfigService; + + [Before] + public function setUp():void + { + instance = new ConfigService(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfConfigService():void + { + assertTrue("instance is ConfigService", instance is ConfigService); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/DefaultConnectionCallbackTest.as b/tests/org/bigbluebutton/core/DefaultConnectionCallbackTest.as new file mode 100644 index 0000000..642f51c --- /dev/null +++ b/tests/org/bigbluebutton/core/DefaultConnectionCallbackTest.as @@ -0,0 +1,33 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class DefaultConnectionCallbackTest + { + protected var instance:DefaultConnectionCallback; + + [Before] + public function setUp():void + { + instance = new DefaultConnectionCallback(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDefaultConnectionCallback():void + { + assertTrue("instance is DefaultConnectionCallback", instance is DefaultConnectionCallback); + } + + [Test] + public function instantiated_implementsIDefaultConnectionCallbackInterface():void + { + assertTrue("instance implements IDefaultConnectionCallback interface", instance is IDefaultConnectionCallback); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/DeskshareConnectionTest.as b/tests/org/bigbluebutton/core/DeskshareConnectionTest.as new file mode 100644 index 0000000..649d7a2 --- /dev/null +++ b/tests/org/bigbluebutton/core/DeskshareConnectionTest.as @@ -0,0 +1,39 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class DeskshareConnectionTest + { + protected var instance:DeskshareConnection; + + [Before] + public function setUp():void + { + instance = new DeskshareConnection(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDeskshareConnection():void + { + assertTrue("instance is DeskshareConnection", instance is DeskshareConnection); + } + + [Test] + public function instantiated_extendsDefaultConnectionCallback():void + { + assertTrue("instance extends DefaultConnectionCallback", instance is DefaultConnectionCallback); + } + + [Test] + public function instantiated_implementsIDeskshareConnectionInterface():void + { + assertTrue("instance implements IDeskshareConnection interface", instance is IDeskshareConnection); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/EnterServiceTest.as b/tests/org/bigbluebutton/core/EnterServiceTest.as new file mode 100644 index 0000000..1dd4083 --- /dev/null +++ b/tests/org/bigbluebutton/core/EnterServiceTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class EnterServiceTest + { + protected var instance:EnterService; + + [Before] + public function setUp():void + { + instance = new EnterService(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfEnterService():void + { + assertTrue("instance is EnterService", instance is EnterService); + } + } +} diff --git a/tests/org/bigbluebutton/core/IBaseConnectionTest.as b/tests/org/bigbluebutton/core/IBaseConnectionTest.as new file mode 100644 index 0000000..aaa0a8a --- /dev/null +++ b/tests/org/bigbluebutton/core/IBaseConnectionTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class IBaseConnectionTest + { + protected var instance:IBaseConnection; + + [Before] + public function setUp():void + { + instance = new BaseConnection(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIBaseConnection():void + { + assertTrue("instance is IBaseConnection", instance is IBaseConnection); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/IBigBlueButtonConnectionTest.as b/tests/org/bigbluebutton/core/IBigBlueButtonConnectionTest.as new file mode 100644 index 0000000..1568fbe --- /dev/null +++ b/tests/org/bigbluebutton/core/IBigBlueButtonConnectionTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class IBigBlueButtonConnectionTest + { + protected var instance:IBigBlueButtonConnection; + + [Before] + public function setUp():void + { + instance = new BigBlueButtonConnection(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIBigBlueButtonConnection():void + { + assertTrue("instance is IBigBlueButtonConnection", instance is IBigBlueButtonConnection); + } + } +} diff --git a/tests/org/bigbluebutton/core/IChatMessageServiceTest.as b/tests/org/bigbluebutton/core/IChatMessageServiceTest.as new file mode 100644 index 0000000..9d25ce5 --- /dev/null +++ b/tests/org/bigbluebutton/core/IChatMessageServiceTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class IChatMessageServiceTest + { + protected var instance:IChatMessageService; + + [Before] + public function setUp():void + { + instance = new ChatMessageService(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIChatMessageService():void + { + assertTrue("instance is IChatMessageService", instance is IChatMessageService); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/IDefaultConnectionCallbackTest.as b/tests/org/bigbluebutton/core/IDefaultConnectionCallbackTest.as new file mode 100644 index 0000000..baa5add --- /dev/null +++ b/tests/org/bigbluebutton/core/IDefaultConnectionCallbackTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class IDefaultConnectionCallbackTest + { + protected var instance:IDefaultConnectionCallback; + + [Before] + public function setUp():void + { + instance = new DefaultConnectionCallback(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIDefaultConnectionCallback():void + { + assertTrue("instance is IDefaultConnectionCallback", instance is IDefaultConnectionCallback); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/IDeskshareConnectionTest.as b/tests/org/bigbluebutton/core/IDeskshareConnectionTest.as new file mode 100644 index 0000000..e0a7845 --- /dev/null +++ b/tests/org/bigbluebutton/core/IDeskshareConnectionTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class IDeskshareConnectionTest + { + protected var instance:IDeskshareConnection; + + [Before] + public function setUp():void + { + instance = new DeskshareConnection(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIDeskshareConnection():void + { + assertTrue("instance is IDeskshareConnection", instance is IDeskshareConnection); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/ILoginServiceTest.as b/tests/org/bigbluebutton/core/ILoginServiceTest.as new file mode 100644 index 0000000..d462e3c --- /dev/null +++ b/tests/org/bigbluebutton/core/ILoginServiceTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class ILoginServiceTest + { + protected var instance:ILoginService; + + [Before] + public function setUp():void + { + instance = new LoginService(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfILoginService():void + { + assertTrue("instance is ILoginService", instance is ILoginService); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/IPresentationServiceTest.as b/tests/org/bigbluebutton/core/IPresentationServiceTest.as new file mode 100644 index 0000000..14f0ec8 --- /dev/null +++ b/tests/org/bigbluebutton/core/IPresentationServiceTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class IPresentationServiceTest + { + protected var instance:IPresentationService; + + [Before] + public function setUp():void + { + instance = new PresentationService(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIPresentationService():void + { + assertTrue("instance is IPresentationService", instance is IPresentationService); + } + } +} diff --git a/tests/org/bigbluebutton/core/IUsersServiceTest.as b/tests/org/bigbluebutton/core/IUsersServiceTest.as new file mode 100644 index 0000000..2bde71e --- /dev/null +++ b/tests/org/bigbluebutton/core/IUsersServiceTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class IUsersServiceTest + { + protected var instance:IUsersService; + + [Before] + public function setUp():void + { + instance = new UsersService(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIUsersService():void + { + assertTrue("instance is IUsersService", instance is IUsersService); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/IVideoConnectionTest.as b/tests/org/bigbluebutton/core/IVideoConnectionTest.as new file mode 100644 index 0000000..cf5f2bb --- /dev/null +++ b/tests/org/bigbluebutton/core/IVideoConnectionTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class IVideoConnectionTest + { + protected var instance:IVideoConnection; + + [Before] + public function setUp():void + { + instance = new VideoConnection(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIVideoConnection():void + { + assertTrue("instance is IVideoConnection", instance is IVideoConnection); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/IVoiceConnectionTest.as b/tests/org/bigbluebutton/core/IVoiceConnectionTest.as new file mode 100644 index 0000000..cc3fec8 --- /dev/null +++ b/tests/org/bigbluebutton/core/IVoiceConnectionTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class IVoiceConnectionTest + { + protected var instance:IVoiceConnection; + + [Before] + public function setUp():void + { + instance = new VoiceConnection(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIVoiceConnection():void + { + assertTrue("instance is IVoiceConnection", instance is IVoiceConnection); + } + } +} diff --git a/tests/org/bigbluebutton/core/JoinServiceTest.as b/tests/org/bigbluebutton/core/JoinServiceTest.as new file mode 100644 index 0000000..5e9cc1e --- /dev/null +++ b/tests/org/bigbluebutton/core/JoinServiceTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class JoinServiceTest + { + protected var instance:JoinService; + + [Before] + public function setUp():void + { + instance = new JoinService(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfJoinService():void + { + assertTrue("instance is JoinService", instance is JoinService); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/LoadSlideServiceTest.as b/tests/org/bigbluebutton/core/LoadSlideServiceTest.as new file mode 100644 index 0000000..bf0e46d --- /dev/null +++ b/tests/org/bigbluebutton/core/LoadSlideServiceTest.as @@ -0,0 +1,47 @@ +package org.bigbluebutton.core +{ + import flash.events.Event; + + import mockolate.prepare; + + import org.bigbluebutton.model.presentation.Slide; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + + public class LoadSlideServiceTest + { + [Mock] + public var slide:Slide; + + private static var TIMEOUT:Number = 5000; + + protected var instance:LoadSlideService; + + [Before(async)] + public function setUp():void + { + // TODO : Provide valid constructor parameters relevant to the test + Async.proceedOnEvent(this, prepare(Slide), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new LoadSlideService(slide); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Ignore] + [Test] + public function instantiated_isInstanceOfLoadSlideService():void + { + assertTrue("instance is LoadSlideService", instance is LoadSlideService); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/core/LoginServiceTest.as b/tests/org/bigbluebutton/core/LoginServiceTest.as new file mode 100644 index 0000000..537c4d8 --- /dev/null +++ b/tests/org/bigbluebutton/core/LoginServiceTest.as @@ -0,0 +1,33 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class LoginServiceTest + { + protected var instance:LoginService; + + [Before] + public function setUp():void + { + instance = new LoginService(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoginService():void + { + assertTrue("instance is LoginService", instance is LoginService); + } + + [Test] + public function instantiated_implementsILoginService():void + { + assertTrue("instance implements ILoginService", instance is ILoginService); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/PresentMessageReceiverTest.as b/tests/org/bigbluebutton/core/PresentMessageReceiverTest.as new file mode 100644 index 0000000..b3d7407 --- /dev/null +++ b/tests/org/bigbluebutton/core/PresentMessageReceiverTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.core +{ + import org.bigbluebutton.model.IMessageListener; + import org.flexunit.asserts.assertTrue; + + public class PresentMessageReceiverTest + { + protected var instance:PresentMessageReceiver; + + [Before] + public function setUp():void + { + instance = new PresentMessageReceiver(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPresentMessageReceiver():void + { + assertTrue("instance is PresentMessageReceiver", instance is PresentMessageReceiver); + } + + [Test] + public function instantiated_implementsIMessageListener():void + { + assertTrue("instance implements IMessageListener", instance is IMessageListener); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/PresentMessageSenderTest.as b/tests/org/bigbluebutton/core/PresentMessageSenderTest.as new file mode 100644 index 0000000..1c9352b --- /dev/null +++ b/tests/org/bigbluebutton/core/PresentMessageSenderTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class PresentMessageSenderTest + { + protected var instance:PresentMessageSender; + + [Before] + public function setUp():void + { + instance = new PresentMessageSender(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPresentMessageSender():void + { + assertTrue("instance is PresentMessageSender", instance is PresentMessageSender); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/PresentationServiceTest.as b/tests/org/bigbluebutton/core/PresentationServiceTest.as new file mode 100644 index 0000000..fc9a2b3 --- /dev/null +++ b/tests/org/bigbluebutton/core/PresentationServiceTest.as @@ -0,0 +1,33 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class PresentationServiceTest + { + protected var instance:PresentationService; + + [Before] + public function setUp():void + { + instance = new PresentationService(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPresentationService():void + { + assertTrue("instance is PresentationService", instance is PresentationService); + } + + [Test] + public function instantiated_implementsIPresentationService():void + { + assertTrue("instance implements IPresentationService", instance is IPresentationService); + } + } +} diff --git a/tests/org/bigbluebutton/core/UsersMessageReceiverTest.as b/tests/org/bigbluebutton/core/UsersMessageReceiverTest.as new file mode 100644 index 0000000..bb39fa7 --- /dev/null +++ b/tests/org/bigbluebutton/core/UsersMessageReceiverTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.core +{ + import org.bigbluebutton.model.IMessageListener; + import org.flexunit.asserts.assertTrue; + + public class UsersMessageReceiverTest + { + protected var instance:UsersMessageReceiver; + + [Before] + public function setUp():void + { + instance = new UsersMessageReceiver(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUsersMessageReceiver():void + { + assertTrue("instance is UsersMessageReceiver", instance is UsersMessageReceiver); + } + + [Test] + public function instantiated_implementsIMessageListener():void + { + assertTrue("instance implements IMessageListener", instance is IMessageListener); + } + } +} diff --git a/tests/org/bigbluebutton/core/UsersMessageSenderTest.as b/tests/org/bigbluebutton/core/UsersMessageSenderTest.as new file mode 100644 index 0000000..e1736fc --- /dev/null +++ b/tests/org/bigbluebutton/core/UsersMessageSenderTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class UsersMessageSenderTest + { + protected var instance:UsersMessageSender; + + [Before] + public function setUp():void + { + instance = new UsersMessageSender(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUsersMessageSender():void + { + assertTrue("instance is UsersMessageSender", instance is UsersMessageSender); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/UsersServiceTest.as b/tests/org/bigbluebutton/core/UsersServiceTest.as new file mode 100644 index 0000000..54a71d9 --- /dev/null +++ b/tests/org/bigbluebutton/core/UsersServiceTest.as @@ -0,0 +1,33 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class UsersServiceTest + { + protected var instance:UsersService; + + [Before] + public function setUp():void + { + instance = new UsersService(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUsersService():void + { + assertTrue("instance is UsersService", instance is UsersService); + } + + [Test] + public function instantiated_implementsIUsersService():void + { + assertTrue("instance implements IUsersService", instance is IUsersService); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/VideoConnectionTest.as b/tests/org/bigbluebutton/core/VideoConnectionTest.as new file mode 100644 index 0000000..d2f75ab --- /dev/null +++ b/tests/org/bigbluebutton/core/VideoConnectionTest.as @@ -0,0 +1,39 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class VideoConnectionTest + { + protected var instance:VideoConnection; + + [Before] + public function setUp():void + { + instance = new VideoConnection(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfVideoConnection():void + { + assertTrue("instance is VideoConnection", instance is VideoConnection); + } + + [Test] + public function instantiated_extendsDefaultConnectionCallback():void + { + assertTrue("instance extends DefaultConnectionCallback", instance is DefaultConnectionCallback); + } + + [Test] + public function instantiated_implementsIVideoConnectionInterface():void + { + assertTrue("instance implements IVideoConnection interface", instance is IVideoConnection); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/VoiceConnectionTest.as b/tests/org/bigbluebutton/core/VoiceConnectionTest.as new file mode 100644 index 0000000..5324ca6 --- /dev/null +++ b/tests/org/bigbluebutton/core/VoiceConnectionTest.as @@ -0,0 +1,39 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class VoiceConnectionTest + { + protected var instance:VoiceConnection; + + [Before] + public function setUp():void + { + instance = new VoiceConnection(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfVoiceConnection():void + { + assertTrue("instance is VoiceConnection", instance is VoiceConnection); + } + + [Test] + public function instantiated_extendsDefaultConnectionCallback():void + { + assertTrue("instance extends DefaultConnectionCallback", instance is DefaultConnectionCallback); + } + + [Test] + public function instantiated_implementsIVoiceConnectionInterface():void + { + assertTrue("instance implements IVoiceConnection interface", instance is IVoiceConnection); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/VoiceStreamManagerTest.as b/tests/org/bigbluebutton/core/VoiceStreamManagerTest.as new file mode 100644 index 0000000..021848b --- /dev/null +++ b/tests/org/bigbluebutton/core/VoiceStreamManagerTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.core +{ + import org.flexunit.asserts.assertTrue; + + public class VoiceStreamManagerTest + { + protected var instance:VoiceStreamManager; + + [Before] + public function setUp():void + { + instance = new VoiceStreamManager(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfVoiceStreamManager():void + { + assertTrue("instance is VoiceStreamManager", instance is VoiceStreamManager); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/util/OrientationCalculatorTest.as b/tests/org/bigbluebutton/core/util/OrientationCalculatorTest.as new file mode 100644 index 0000000..145a586 --- /dev/null +++ b/tests/org/bigbluebutton/core/util/OrientationCalculatorTest.as @@ -0,0 +1,37 @@ +package org.bigbluebutton.core.util +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + import flash.display.DisplayObject; + + public class OrientationCalculatorTest + { + protected var instance:OrientationCalculator; + + [Before] + public function setUp():void + { + // TODO : Provide valid constructor parameters relevant to the test + instance = new OrientationCalculator(new DisplayObject(), testFunction); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Ignore] + [Test] + public function instantiated_isInstanceOfOrientationCalculator():void + { + assertTrue("instance is OrientationCalculator", instance is OrientationCalculator); + } + + private function testFunction():void + { + + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/util/URLFetcherTest.as b/tests/org/bigbluebutton/core/util/URLFetcherTest.as new file mode 100644 index 0000000..82982f9 --- /dev/null +++ b/tests/org/bigbluebutton/core/util/URLFetcherTest.as @@ -0,0 +1,29 @@ +package org.bigbluebutton.core.util +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class URLFetcherTest + { + protected var instance:URLFetcher; + + [Before] + public function setUp():void + { + instance = new URLFetcher(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfURLFetcher():void + { + assertTrue("instance is URLFetcher", instance is URLFetcher); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/util/URLParserTest.as b/tests/org/bigbluebutton/core/util/URLParserTest.as new file mode 100644 index 0000000..905493c --- /dev/null +++ b/tests/org/bigbluebutton/core/util/URLParserTest.as @@ -0,0 +1,29 @@ +package org.bigbluebutton.core.util +{ + import org.flexunit.asserts.assertTrue; + + public class URLParserTest + { + protected var instance:URLParser; + + [Before] + public function setUp():void + { + // TODO : Provide valid constructor parameters relevant to the test + instance = new URLParser("testString"); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Ignore] + [Test] + public function instantiated_isInstanceOfURLParser():void + { + assertTrue("instance is URLParser", instance is URLParser); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/util/VectorUtilTest.as b/tests/org/bigbluebutton/core/util/VectorUtilTest.as new file mode 100644 index 0000000..882d0da --- /dev/null +++ b/tests/org/bigbluebutton/core/util/VectorUtilTest.as @@ -0,0 +1,29 @@ +package org.bigbluebutton.core.util +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class VectorUtilTest + { + protected var instance:VectorUtil; + + [Before] + public function setUp():void + { + instance = new VectorUtil(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfVectorUtil():void + { + assertTrue("instance is VectorUtil", instance is VectorUtil); + } + } +} diff --git a/tests/org/bigbluebutton/core/view/IViewTest.as b/tests/org/bigbluebutton/core/view/IViewTest.as new file mode 100644 index 0000000..53fad33 --- /dev/null +++ b/tests/org/bigbluebutton/core/view/IViewTest.as @@ -0,0 +1,31 @@ +package org.bigbluebutton.core.view +{ + import org.bigbluebutton.view.navigation.PagesNavigatorView; + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class IViewTest + { + protected var instance:IView; + + [Before] + public function setUp():void + { + // TODO : Provide valid constructor parameters relevant to the test + instance = new PagesNavigatorView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIView():void + { + assertTrue("instance is IView", instance is IView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/core/view/NoTabViewTest.as b/tests/org/bigbluebutton/core/view/NoTabViewTest.as new file mode 100644 index 0000000..2509013 --- /dev/null +++ b/tests/org/bigbluebutton/core/view/NoTabViewTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.core.view +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class NoTabViewTest + { + protected var instance:NoTabView; + + [Before] + public function setUp():void + { + instance = new NoTabView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfNoTabView():void + { + assertTrue("instance is NoTabView", instance is NoTabView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + } +} diff --git a/tests/org/bigbluebutton/model/ConferenceParametersTest.as b/tests/org/bigbluebutton/model/ConferenceParametersTest.as new file mode 100644 index 0000000..ae2d0b7 --- /dev/null +++ b/tests/org/bigbluebutton/model/ConferenceParametersTest.as @@ -0,0 +1,33 @@ +package org.bigbluebutton.model +{ + import org.flexunit.asserts.assertTrue; + + public class ConferenceParametersTest + { + protected var instance:ConferenceParameters; + + [Before] + public function setUp():void + { + instance = new ConferenceParameters(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfConferenceParameters():void + { + assertTrue("instance is ConferenceParameters", instance is ConferenceParameters); + } + + [Test] + public function instantiated_implementsIConferenceParametersInterface():void + { + assertTrue("instance implements IConferenceParameters interface", instance is IConferenceParameters); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/ConfigTest.as b/tests/org/bigbluebutton/model/ConfigTest.as new file mode 100644 index 0000000..ea712b5 --- /dev/null +++ b/tests/org/bigbluebutton/model/ConfigTest.as @@ -0,0 +1,28 @@ +package org.bigbluebutton.model +{ + import org.flexunit.asserts.assertTrue; + + public class ConfigTest + { + protected var instance:Config; + + [Before] + public function setUp():void + { + // TODO : Provide valid constructor parameters relevant to the test + instance = new Config(new XML()); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfConfig():void + { + assertTrue("instance is Config", instance is Config); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/ConnectionFailedEventTest.as b/tests/org/bigbluebutton/model/ConnectionFailedEventTest.as new file mode 100644 index 0000000..d6daaaf --- /dev/null +++ b/tests/org/bigbluebutton/model/ConnectionFailedEventTest.as @@ -0,0 +1,36 @@ +package org.bigbluebutton.model +{ + import flash.events.Event; + + import org.flexunit.asserts.assertTrue; + + public class ConnectionFailedEventTest + { + protected var instance:ConnectionFailedEvent; + + [Before] + public function setUp():void + { + // TODO : Provide valid constructor parameters relevant to the test + instance = new ConnectionFailedEvent("testEvent"); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfConnectionFailedEvent():void + { + assertTrue("instance is ConnectionFailedEvent", instance is ConnectionFailedEvent); + } + + [Test] + public function instantiated_isInstanceOfEvent():void + { + assertTrue("instance is Event", instance is Event); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/IConferenceParametersTest.as b/tests/org/bigbluebutton/model/IConferenceParametersTest.as new file mode 100644 index 0000000..6d16435 --- /dev/null +++ b/tests/org/bigbluebutton/model/IConferenceParametersTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.model +{ + import org.flexunit.asserts.assertTrue; + + public class IConferenceParametersTest + { + protected var instance:IConferenceParameters; + + [Before] + public function setUp():void + { + instance = new ConferenceParameters(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIConferenceParameters():void + { + assertTrue("instance is IConferenceParameters", instance is IConferenceParameters); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/IMessageListenerTest.as b/tests/org/bigbluebutton/model/IMessageListenerTest.as new file mode 100644 index 0000000..db51af9 --- /dev/null +++ b/tests/org/bigbluebutton/model/IMessageListenerTest.as @@ -0,0 +1,49 @@ +package org.bigbluebutton.model +{ + import flash.events.Event; + + import mockolate.prepare; + + import org.bigbluebutton.core.ChatMessageReceiver; + import org.bigbluebutton.model.chat.ChatMessagesSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + + public class IMessageListenerTest + { + [Mock] + public var chatMessageSession:ChatMessagesSession; + + [Mock] + public var userSession:UserSession; + + private static var TIMEOUT:Number = 5000; + + protected var instance:IMessageListener; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(UserSession, ChatMessagesSession), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new ChatMessageReceiver(userSession, chatMessageSession); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIMessageListener():void + { + assertTrue("instance is IMessageListener", instance is IMessageListener); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/IUserSessionTest.as b/tests/org/bigbluebutton/model/IUserSessionTest.as new file mode 100644 index 0000000..d6d07f1 --- /dev/null +++ b/tests/org/bigbluebutton/model/IUserSessionTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.model +{ + import org.flexunit.asserts.assertTrue; + + public class IUserSessionTest + { + protected var instance:IUserSession; + + [Before] + public function setUp():void + { + instance = new UserSession(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIUserSession():void + { + assertTrue("instance is IUserSession", instance is IUserSession); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/IUserUISessionTest.as b/tests/org/bigbluebutton/model/IUserUISessionTest.as new file mode 100644 index 0000000..6adc507 --- /dev/null +++ b/tests/org/bigbluebutton/model/IUserUISessionTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.model +{ + import org.flexunit.asserts.assertTrue; + + public class IUserUISessionTest + { + protected var instance:IUserUISession; + + [Before] + public function setUp():void + { + instance = new UserUISession(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIUserUISession():void + { + assertTrue("instance is IUserUISession", instance is IUserUISession); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/UserListTest.as b/tests/org/bigbluebutton/model/UserListTest.as new file mode 100644 index 0000000..5488225 --- /dev/null +++ b/tests/org/bigbluebutton/model/UserListTest.as @@ -0,0 +1,57 @@ +package org.bigbluebutton.model +{ + import flash.events.Event; + + import org.flexunit.asserts.assertTrue; + import org.osflash.signals.Signal; + + public class UserListTest + { + protected var instance:UserList; + + [Before] + public function setUp():void + { + instance = new UserList(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUserList():void + { + assertTrue("instance is UserList", instance is UserList); + } + + [Test] + public function listenerRemoved_numberOfListenersIsNull():void + { + // Arrange + instance.userChangeSignal.add(listener); + + // Act + instance.userChangeSignal.remove(listener); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.userChangeSignal.numListeners == 0); + } + + [Test] + public function listenerAdded_numberOfListenersIsNotNull():void + { + // Act + instance.userChangeSignal.add(listener); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.userChangeSignal.numListeners != 0); + } + + private function listener(e : Event) : void + { + } + } +} diff --git a/tests/org/bigbluebutton/model/UserSessionTest.as b/tests/org/bigbluebutton/model/UserSessionTest.as new file mode 100644 index 0000000..1ebecf7 --- /dev/null +++ b/tests/org/bigbluebutton/model/UserSessionTest.as @@ -0,0 +1,33 @@ +package org.bigbluebutton.model +{ + import org.flexunit.asserts.assertTrue; + + public class UserSessionTest + { + protected var instance:UserSession; + + [Before] + public function setUp():void + { + instance = new UserSession(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUserSession():void + { + assertTrue("instance is UserSession", instance is UserSession); + } + + [Test] + public function instantiated_implementsIUserSession():void + { + assertTrue("instance implements IUserSession interface", instance is IUserSession); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/UserSettingsTests.as b/tests/org/bigbluebutton/model/UserSettingsTests.as deleted file mode 100644 index 7910836..0000000 --- a/tests/org/bigbluebutton/model/UserSettingsTests.as +++ /dev/null @@ -1,16 +0,0 @@ -package org.bigbluebutton.model -{ - import flash.events.TimerEvent; - import flash.utils.Timer; - - public class UserSettingsTests - { - /** - * Creates the test subject with its dependencies. - */ - private function createModel(): UserSettings - { - return new UserSettings(); - } - } -} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/UserTest.as b/tests/org/bigbluebutton/model/UserTest.as new file mode 100644 index 0000000..f3e46b2 --- /dev/null +++ b/tests/org/bigbluebutton/model/UserTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.model +{ + import org.flexunit.asserts.assertTrue; + + public class UserTest + { + protected var instance:User; + + [Before] + public function setUp():void + { + instance = new User(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUser():void + { + assertTrue("instance is User", instance is User); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/UserUISessionTest.as b/tests/org/bigbluebutton/model/UserUISessionTest.as new file mode 100644 index 0000000..616b144 --- /dev/null +++ b/tests/org/bigbluebutton/model/UserUISessionTest.as @@ -0,0 +1,33 @@ +package org.bigbluebutton.model +{ + import org.flexunit.asserts.assertTrue; + + public class UserUISessionTest + { + protected var instance:UserUISession; + + [Before] + public function setUp():void + { + instance = new UserUISession(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUserUISession():void + { + assertTrue("instance is UserSession", instance is UserUISession); + } + + [Test] + public function instantiated_implementsIUserUISession():void + { + assertTrue("instance implements IUserUISession interface", instance is IUserUISession); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/ChatMessageTest.as b/tests/org/bigbluebutton/model/chat/ChatMessageTest.as new file mode 100644 index 0000000..3d5ab5b --- /dev/null +++ b/tests/org/bigbluebutton/model/chat/ChatMessageTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.model.chat +{ + import org.flexunit.asserts.assertTrue; + + public class ChatMessageTest + { + protected var instance:ChatMessage; + + [Before] + public function setUp():void + { + instance = new ChatMessage(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatMessage():void + { + assertTrue("instance is ChatMessage", instance is ChatMessage); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/ChatMessageVOTest.as b/tests/org/bigbluebutton/model/chat/ChatMessageVOTest.as new file mode 100644 index 0000000..7afe06e --- /dev/null +++ b/tests/org/bigbluebutton/model/chat/ChatMessageVOTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.model.chat +{ + import org.flexunit.asserts.assertTrue; + + public class ChatMessageVOTest + { + protected var instance:ChatMessageVO; + + [Before] + public function setUp():void + { + instance = new ChatMessageVO(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatMessageVO():void + { + assertTrue("instance is ChatMessageVO", instance is ChatMessageVO); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/ChatMessagesSessionTest.as b/tests/org/bigbluebutton/model/chat/ChatMessagesSessionTest.as new file mode 100644 index 0000000..923c326 --- /dev/null +++ b/tests/org/bigbluebutton/model/chat/ChatMessagesSessionTest.as @@ -0,0 +1,33 @@ +package org.bigbluebutton.model.chat +{ + import org.flexunit.asserts.assertTrue; + + public class ChatMessagesSessionTest + { + protected var instance:ChatMessagesSession; + + [Before] + public function setUp():void + { + instance = new ChatMessagesSession(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatMessagesSession():void + { + assertTrue("instance is ChatMessagesSession", instance is ChatMessagesSession); + } + + [Test] + public function instantiated_implementsIChatMessagesSessionInterface():void + { + assertTrue("instance implements IChatMessagesSession interface", instance is IChatMessagesSession); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/ChatMessagesTest.as b/tests/org/bigbluebutton/model/chat/ChatMessagesTest.as new file mode 100644 index 0000000..690895d --- /dev/null +++ b/tests/org/bigbluebutton/model/chat/ChatMessagesTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.model.chat +{ + import org.flexunit.asserts.assertTrue; + + public class ChatMessagesTest + { + protected var instance:ChatMessages; + + [Before] + public function setUp():void + { + instance = new ChatMessages(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatMessages():void + { + assertTrue("instance is ChatMessages", instance is ChatMessages); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/IChatMessagesSessionTest.as b/tests/org/bigbluebutton/model/chat/IChatMessagesSessionTest.as new file mode 100644 index 0000000..2c959c8 --- /dev/null +++ b/tests/org/bigbluebutton/model/chat/IChatMessagesSessionTest.as @@ -0,0 +1,29 @@ +package org.bigbluebutton.model.chat +{ + import flash.utils.getQualifiedClassName; + + import org.flexunit.asserts.assertTrue; + + public class IChatMessagesSessionTest + { + protected var instance:IChatMessagesSession; + + [Before] + public function setUp():void + { + instance = new ChatMessagesSession(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIChatMessagesSession():void + { + assertTrue("instance is IChatMessagesSession", instance is IChatMessagesSession); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/PrivateChatMessageTest.as b/tests/org/bigbluebutton/model/chat/PrivateChatMessageTest.as new file mode 100644 index 0000000..cdac55b --- /dev/null +++ b/tests/org/bigbluebutton/model/chat/PrivateChatMessageTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.model.chat +{ + import org.flexunit.asserts.assertTrue; + + public class PrivateChatMessageTest + { + protected var instance:PrivateChatMessage; + + [Before] + public function setUp():void + { + instance = new PrivateChatMessage(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPrivateChatMessage():void + { + assertTrue("instance is PrivateChatMessage", instance is PrivateChatMessage); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/UserVOTest.as b/tests/org/bigbluebutton/model/chat/UserVOTest.as new file mode 100644 index 0000000..6db328c --- /dev/null +++ b/tests/org/bigbluebutton/model/chat/UserVOTest.as @@ -0,0 +1,28 @@ +package org.bigbluebutton.model.chat +{ + import org.flexunit.asserts.assertTrue; + + public class UserVOTest + { + protected var instance:UserVO; + + [Before] + public function setUp():void + { + // TODO : Provide valid constructor parameters relevant to the test + instance = new UserVO("testUsername", "testID"); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUserVO():void + { + assertTrue("instance is UserVO", instance is UserVO); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/presentation/PresentationListTest.as b/tests/org/bigbluebutton/model/presentation/PresentationListTest.as new file mode 100644 index 0000000..7ab30a4 --- /dev/null +++ b/tests/org/bigbluebutton/model/presentation/PresentationListTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.model.presentation +{ + import org.flexunit.asserts.assertTrue; + + public class PresentationListTest + { + protected var instance:PresentationList; + + [Before] + public function setUp():void + { + instance = new PresentationList(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPresentationList():void + { + assertTrue("instance is PresentationList", instance is PresentationList); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/presentation/PresentationTest.as b/tests/org/bigbluebutton/model/presentation/PresentationTest.as new file mode 100644 index 0000000..ff26092 --- /dev/null +++ b/tests/org/bigbluebutton/model/presentation/PresentationTest.as @@ -0,0 +1,28 @@ +package org.bigbluebutton.model.presentation +{ + import org.flexunit.asserts.assertTrue; + + public class PresentationTest + { + protected var instance:Presentation; + + [Before] + public function setUp():void + { + // TODO : Provide valid constructor parameters relevant to the test + instance = new Presentation("testFileName", new Function(), 1, true); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPresentation():void + { + assertTrue("instance is Presentation", instance is Presentation); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/presentation/SlideTest.as b/tests/org/bigbluebutton/model/presentation/SlideTest.as new file mode 100644 index 0000000..3d55447 --- /dev/null +++ b/tests/org/bigbluebutton/model/presentation/SlideTest.as @@ -0,0 +1,28 @@ +package org.bigbluebutton.model.presentation +{ + import org.flexunit.asserts.assertTrue; + + public class SlideTest + { + protected var instance:Slide; + + [Before] + public function setUp():void + { + // TODO : Provide valid constructor parameters relevant to the test + instance = new Slide(1, "testSlideURI", "testThumbURI", "testTxtURI", true); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSlide():void + { + assertTrue("instance is Slide", instance is Slide); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/testing/MediatorTests.as b/tests/org/bigbluebutton/testing/MediatorTests.as deleted file mode 100644 index f066169..0000000 --- a/tests/org/bigbluebutton/testing/MediatorTests.as +++ /dev/null @@ -1,20 +0,0 @@ -package org.bigbluebutton.testing -{ - import org.mockito.integrations.mock; - - import robotlegs.bender.bundles.mvcs.Mediator; - import robotlegs.bender.extensions.localEventMap.api.IEventMap; - - public class MediatorTests - { - /** - * Sets the dependencies on a mediator ensuring it has - * all the dependencies that the RL framework will provide - * when the application is running. - */ - protected function setupMediator(mediator: Mediator): void - { - mediator.eventMap = mock(IEventMap); - } - } -} \ No newline at end of file diff --git a/tests/org/bigbluebutton/testing/ViewTests.as b/tests/org/bigbluebutton/testing/ViewTests.as deleted file mode 100644 index 386dc3b..0000000 --- a/tests/org/bigbluebutton/testing/ViewTests.as +++ /dev/null @@ -1,54 +0,0 @@ -package org.bigbluebutton.testing -{ - import flash.events.Event; - import flash.events.IEventDispatcher; - import flash.events.MouseEvent; - - import mx.core.UIComponent; - - import org.fluint.uiImpersonation.UIImpersonator; - - import spark.components.Button; - import spark.components.TextArea; - - public class ViewTests - { - /** - * Adds a UIComponent to a mock of the display list. - */ - protected function addToUI(view: UIComponent): void - { - UIImpersonator.addChild(view); - } - - /** - * Generic teardown for each test. - */ - public function after(): void - { - UIImpersonator.removeAllChildren(); - } - - /** - * Mimics the user clicking a button. - */ - protected function click(button: IEventDispatcher): void - { - button.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); - } - - /** - * Dummy method used to test signals. - */ - protected function dummyMethod(): void { } - - /** - * Updates thats text of a TextArea and dispatches its change event. - */ - protected function updateText(textArea: TextArea, updateTextTo: String): void - { - textArea.text = updateTextTo; - textArea.dispatchEvent(new Event(Event.CHANGE)); - } - } -} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/IPagesNavigatorViewTest.as b/tests/org/bigbluebutton/view/navigation/IPagesNavigatorViewTest.as new file mode 100644 index 0000000..80ce37d --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/IPagesNavigatorViewTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation +{ + import org.flexunit.asserts.assertTrue; + + public class IPagesNavigatorViewTest + { + protected var instance:IPagesNavigatorView; + + [Before] + public function setUp():void + { + instance = new PagesNavigatorView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPagesNavigatorView():void + { + assertTrue("instance is PagesNavigatorView", instance is PagesNavigatorView); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/PagesNavigatorConfigTest.as b/tests/org/bigbluebutton/view/navigation/PagesNavigatorConfigTest.as new file mode 100644 index 0000000..77ae158 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/PagesNavigatorConfigTest.as @@ -0,0 +1,140 @@ +package org.bigbluebutton.view.navigation +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.command.JoinMeetingSignal; + import org.bigbluebutton.command.RaiseHandSignal; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.osflash.signals.Signal; + + import robotlegs.bender.extensions.commandCenter.dsl.ICommandMapper; + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class PagesNavigatorConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + [Mock] + public var commandMapper:ICommandMapper; + + private static var TIMEOUT:Number = 5000; + + protected var instance:PagesNavigatorConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper, ICommandMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new PagesNavigatorConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPagesNavigatorConfig():void + { + assertTrue("instance is PagesNavigatorConfig", instance is PagesNavigatorConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IPagesNavigatorView).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(JoinMeetingSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IPagesNavigatorView).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(JoinMeetingSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + [Test] + public function executed_callsSignalCommandMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IPagesNavigatorView).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(JoinMeetingSignal).returns(commandMapper); + + + // Act + instance.configure(); + + // Assert + assertThat(instance.signalCommandMap, received().method('map')); + } + + [Test] + public function executed_callsCommandMapperToCommandMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IPagesNavigatorView).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(JoinMeetingSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(commandMapper, received().method('toCommand')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/PagesNavigatorViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/PagesNavigatorViewBaseTest.as new file mode 100644 index 0000000..31b9203 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/PagesNavigatorViewBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.ViewNavigator; + + public class PagesNavigatorViewBaseTest + { + protected var instance:PagesNavigatorViewBase; + + [Before] + public function setUp():void + { + instance = new PagesNavigatorViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPagesNavigatorViewBase():void + { + assertTrue("instance is PagesNavigatorViewBase", instance is PagesNavigatorViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark ViewNavigator component", instance is ViewNavigator); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/PagesNavigatorViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/PagesNavigatorViewMediatorTest.as new file mode 100644 index 0000000..5fcc105 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/PagesNavigatorViewMediatorTest.as @@ -0,0 +1,81 @@ +package org.bigbluebutton.view.navigation +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.model.UserUISession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class PagesNavigatorViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:PagesNavigatorView; + + [Mock] + public var userUISession:UserUISession; + + [Mock] + public var pageChangedSignal:Signal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:PagesNavigatorViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(PagesNavigatorView, Signal, UserUISession), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new PagesNavigatorViewMediator(); + + instance.view = this.view; + instance.userUISession = this.userUISession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPagesNavigatorViewMediator():void + { + assertTrue("instance is PagesNavigatorViewMediator", instance is PagesNavigatorViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userUISession).getter("pageChangedSignal").returns(this.pageChangedSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/PagesNavigatorViewTest.as b/tests/org/bigbluebutton/view/navigation/PagesNavigatorViewTest.as new file mode 100644 index 0000000..b546c4b --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/PagesNavigatorViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.ViewNavigator; + + public class PagesNavigatorViewTest + { + protected var instance:PagesNavigatorView; + + [Before] + public function setUp():void + { + instance = new PagesNavigatorView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPagesNavigatorView():void + { + assertTrue("instance is PagesNavigatorView", instance is PagesNavigatorView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark ViewNavigator component", instance is ViewNavigator); + } + + [Test] + public function instantiated_implementsIPagesNavigatorView():void + { + assertTrue("instance implements IPagesNavigatorView", instance is IPagesNavigatorView); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/PagesENUMTest.as b/tests/org/bigbluebutton/view/navigation/pages/PagesENUMTest.as new file mode 100644 index 0000000..9495f43 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/PagesENUMTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages +{ + import org.flexunit.asserts.assertTrue; + + public class PagesENUMTest + { + protected var instance:PagesENUM; + + [Before] + public function setUp():void + { + instance = new PagesENUM(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPagesENUM():void + { + assertTrue("instance is PagesENUM", instance is PagesENUM); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/TransitionAnimationENUMTest.as b/tests/org/bigbluebutton/view/navigation/pages/TransitionAnimationENUMTest.as new file mode 100644 index 0000000..e89dfbf --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/TransitionAnimationENUMTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages +{ + import org.flexunit.asserts.assertTrue; + + public class TransitionAnimationENUMTest + { + protected var instance:TransitionAnimationENUM; + + [Before] + public function setUp():void + { + instance = new TransitionAnimationENUM(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfTransitionAnimationENUM():void + { + assertTrue("instance is TransitionAnimationENUM", instance is TransitionAnimationENUM); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/chat/ChatConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatConfigTest.as new file mode 100644 index 0000000..5ce9181 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatConfigTest.as @@ -0,0 +1,102 @@ +package org.bigbluebutton.view.navigation.pages.chat +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class ChatConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:ChatConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new ChatConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatConfig():void + { + assertTrue("instance is ChatConfig", instance is ChatConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IChatView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IChatView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/chat/ChatItemRendererTest.as b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatItemRendererTest.as new file mode 100644 index 0000000..53ae992 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatItemRendererTest.as @@ -0,0 +1,74 @@ +package org.bigbluebutton.view.navigation.pages.chat +{ + import flash.events.Event; + + import flashx.textLayout.debug.assert; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + + import org.bigbluebutton.model.chat.ChatMessage; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.object.IsNullMatcher; + import org.hamcrest.object.nullValue; + + import spark.components.supportClasses.ItemRenderer; + + public class ChatItemRendererTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + private static var TIMEOUT:Number = 5000; + + [Mock] + public var chatMessage:ChatMessage; + + protected var instance:ChatItemRenderer; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(ChatMessage), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new ChatItemRenderer(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatItemRenderer():void + { + assertTrue("instance is ChatItemRenderer", instance is ChatItemRenderer); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark ItemRenderer component", instance is ItemRenderer); + } + + [Test] + public function setDataMethodCalledWhenChatMessageIsNull_MessageTextIsEmpty():void + { + // Arrange + chatMessage = null; + + // Act + instance.data = chatMessage; + + // Assert + assertTrue("If ChatMessage object is null, ChatItemRender's message text property should be empty", instance.message.text == ""); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/chat/ChatListTest.as b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatListTest.as new file mode 100644 index 0000000..fc91dd9 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatListTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.chat +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.List; + + public class ChatListTest + { + protected var instance:ChatList; + + [Before] + public function setUp():void + { + instance = new ChatList(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatList():void + { + assertTrue("instance is ChatList", instance is ChatList); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark List component", instance is List); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewBaseTest.as new file mode 100644 index 0000000..8aac8dc --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewBaseTest.as @@ -0,0 +1,73 @@ +package org.bigbluebutton.view.navigation.pages.chat +{ + import flash.events.MouseEvent; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + + import spark.components.Button; + import spark.components.TextInput; + import spark.components.View; + + public class ChatViewBaseTest + { + protected var instance:ChatViewBase; + + [Before(async)] + public function setUp():void + { + instance = new ChatViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatViewBase():void + { + assertTrue("instance is ChatViewBase", instance is ChatViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function inputMessageEmpty_sendButtonDisabled():void + { + // Arrange + instance.sendButton0 = new Button(); + instance.inputMessage0 = new TextInput(); + + // Act + instance.inputMessage0.text = ""; + + // Assert + assertTrue(instance.sendButton0.enabled == false); + } + + [Test] + public function inputMessageNonEmpty_sendButtonEnabled():void + { + // Arrange + instance.sendButton0 = new Button(); + instance.inputMessage0 = new TextInput(); + + // Act + instance.inputMessage0.text = "Test"; + + // Assert + assertTrue(instance.sendButton0.enabled == true); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediatorTest.as new file mode 100644 index 0000000..0cadb6f --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediatorTest.as @@ -0,0 +1,124 @@ +package org.bigbluebutton.view.navigation.pages.chat +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.core.ChatMessageService; + import org.bigbluebutton.model.UserList; + import org.bigbluebutton.model.UserSession; + import org.bigbluebutton.model.UserUISession; + import org.bigbluebutton.model.chat.ChatMessagesSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + import spark.components.Button; + import spark.components.List; + + public class ChatViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:ChatView; + + [Mock] + public var chatMessageService:ChatMessageService; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var userUISession:UserUISession; + + [Mock] + public var chatMessagesSession:ChatMessagesSession; + + [Mock] + public var list:List; + + [Mock] + public var sendButton:Button; + + [Mock] + public var sendMessageOnSuccessSignal:Signal; + + [Mock] + public var sendMessageOnFailureSignal:Signal; + + [Mock] + public var userList:UserList; + + [Mock] + public var userRemovedSignal:Signal; + + [Mock] + public var userAddedSignal:Signal + + private static var TIMEOUT:Number = 5000; + + protected var instance:ChatViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(ChatView, ChatMessageService, UserSession, UserUISession, ChatMessagesSession, List, Button, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new ChatViewMediator(); + + instance.chatMessageService = this.chatMessageService; + instance.chatMessagesSession = this.chatMessagesSession; + instance.userSession = this.userSession; + instance.userUISession = this.userUISession; + instance.view = this.view; + instance.list = this.list; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatViewMediator():void + { + assertTrue("instance is ChatViewMediator", instance is ChatViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.view).getter("sendButton").returns(this.sendButton); + stub(instance.chatMessageService).getter("sendMessageOnSuccessSignal").returns(this.sendMessageOnSuccessSignal); + stub(instance.chatMessageService).getter("sendMessageOnFailureSignal").returns(this.sendMessageOnFailureSignal); + stub(instance.userSession).getter("userList").returns(this.userList); + stub(instance.userSession.userList).getter("userAddedSignal").returns(this.userAddedSignal); + stub(instance.userSession.userList).getter("userRemovedSignal").returns(this.userRemovedSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewTest.as new file mode 100644 index 0000000..a760e56 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewTest.as @@ -0,0 +1,54 @@ +package org.bigbluebutton.view.navigation.pages.chat +{ + import flash.events.Event; + import flash.events.MouseEvent; + + import mockolate.arg; + import mockolate.expect; + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.core.anything; + + import spark.components.Button; + import spark.components.View; + + public class ChatViewTest + { + protected var instance:ChatView; + + [Before] + public function setUp():void + { + instance = new ChatView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatView():void + { + assertTrue("instance is ChatView", instance is ChatView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function instantiated_implementsIChatView():void + { + assertTrue("instance implements IChatView", instance is IChatView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/chat/IChatViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/chat/IChatViewTest.as new file mode 100644 index 0000000..ef15496 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chat/IChatViewTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.view.navigation.pages.chat +{ + import org.bigbluebutton.core.view.IView; + import org.flexunit.asserts.assertTrue; + + public class IChatViewTest + { + protected var instance:IChatView; + + [Before] + public function setUp():void + { + instance = new ChatView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatView():void + { + assertTrue("instance is ChatView", instance is ChatView); + } + + [Test] + public function instantiated_implementsIView():void + { + assertTrue("instance implements IView", instance is IView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsConfigTest.as new file mode 100644 index 0000000..c48f0a7 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsConfigTest.as @@ -0,0 +1,102 @@ +package org.bigbluebutton.view.navigation.pages.chatrooms +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class ChatRoomsConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:ChatRoomsConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new ChatRoomsConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatRoomsConfig():void + { + assertTrue("instance is ChatRoomsConfig", instance is ChatRoomsConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IChatRoomsView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IChatRoomsView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsItemRendererTest.as b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsItemRendererTest.as new file mode 100644 index 0000000..164f568 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsItemRendererTest.as @@ -0,0 +1,70 @@ +package org.bigbluebutton.view.navigation.pages.chatrooms +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + + import org.bigbluebutton.model.chat.ChatMessages; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + + import spark.components.supportClasses.ItemRenderer; + + public class ChatRoomsItemRendererTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + private static var TIMEOUT:Number = 5000; + + [Mock] + public var chatMessages:ChatMessages; + + protected var instance:ChatRoomsItemRenderer; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(ChatMessages), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new ChatRoomsItemRenderer(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatRoomsItemRenderer():void + { + assertTrue("instance is ChatRoomsItemRenderer", instance is ChatRoomsItemRenderer); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark ItemRenderer component", instance is ItemRenderer); + } + + [Test] + public function setDataMethodCalledWhenChatMessagesIsNull_TitleTextIsEmpty():void + { + // Arrange + chatMessages = null; + + // Act + instance.data = chatMessages; + + // Assert + assertTrue("If ChatMessages object is null, ChatRoomsItemRenderer's message text property should be empty", instance.title.text == ""); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsListTest.as b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsListTest.as new file mode 100644 index 0000000..892521b --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsListTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.chatrooms +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.List; + + public class ChatRoomsListTest + { + protected var instance:ChatRoomsList; + + [Before] + public function setUp():void + { + instance = new ChatRoomsList(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatRoomsList():void + { + assertTrue("instance is ChatRoomsList", instance is ChatRoomsList); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark List component", instance is List); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewBaseTest.as new file mode 100644 index 0000000..1eadcff --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.chatrooms +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class ChatRoomsViewBaseTest + { + protected var instance:ChatRoomsViewBase; + + [Before] + public function setUp():void + { + instance = new ChatRoomsViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatRoomsViewBase():void + { + assertTrue("instance is ChatRoomsViewBase", instance is ChatRoomsViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediatorTest.as new file mode 100644 index 0000000..eb95550 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediatorTest.as @@ -0,0 +1,121 @@ +package org.bigbluebutton.view.navigation.pages.chatrooms +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.core.IChatMessageService; + import org.bigbluebutton.model.IUserSession; + import org.bigbluebutton.model.IUserUISession; + import org.bigbluebutton.model.UserList; + import org.bigbluebutton.model.UserSession; + import org.bigbluebutton.model.UserUISession; + import org.bigbluebutton.model.chat.ChatMessages; + import org.bigbluebutton.model.chat.ChatMessagesSession; + import org.bigbluebutton.model.chat.IChatMessagesSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + import spark.components.Button; + import spark.components.List; + + public class ChatRoomsViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:ChatRoomsView; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var userUISession:UserUISession; + + [Mock] + public var chatMessagesSession:ChatMessagesSession; + + [Mock] + public var list:List; + + [Mock] + public var userList:UserList; + + [Mock] + public var userRemovedSignal:Signal; + + [Mock] + public var userAddedSignal:Signal + + [Mock] + public var publicChat:ChatMessages; + + [Mock] + public var chatMessageChangeSignal:Signal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:ChatRoomsViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(ChatRoomsView, UserSession, UserUISession, ChatMessagesSession, Signal, ChatMessages, List, UserList), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new ChatRoomsViewMediator(); + + instance.chatMessagesSession = this.chatMessagesSession; + instance.userSession = this.userSession; + instance.userUISession = this.userUISession; + instance.view = this.view; + instance.list = this.list + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatRoomsViewMediator():void + { + assertTrue("instance is ChatRoomsViewMediator", instance is ChatRoomsViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.chatMessagesSession).getter("publicChat").returns(this.publicChat); + stub(instance.chatMessagesSession.publicChat).getter("chatMessageChangeSignal").returns(this.chatMessageChangeSignal); + stub(instance.userSession).getter("userList").returns(this.userList); + stub(instance.userSession.userList).getter("userAddedSignal").returns(this.userAddedSignal); + stub(instance.userSession.userList).getter("userRemovedSignal").returns(this.userRemovedSignal); + stub(instance.chatMessagesSession).getter("chatMessageChangeSignal").returns(this.chatMessageChangeSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewTest.as new file mode 100644 index 0000000..7e87065 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation.pages.chatrooms +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class ChatRoomsViewTest + { + protected var instance:ChatRoomsView; + + [Before] + public function setUp():void + { + instance = new ChatRoomsView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatRoomsView():void + { + assertTrue("instance is ChatRoomsView", instance is ChatRoomsView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function instantiated_implementsIChatRoomsView():void + { + assertTrue("instance implements IChatRoomsView", instance is IChatRoomsView); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/chatrooms/IChatRoomsViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/IChatRoomsViewTest.as new file mode 100644 index 0000000..f1f5fa0 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/IChatRoomsViewTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.view.navigation.pages.chatrooms +{ + import org.bigbluebutton.core.view.IView; + import org.flexunit.asserts.assertTrue; + + public class IChatRoomsViewTest + { + protected var instance:IChatRoomsView; + + [Before] + public function setUp():void + { + instance = new ChatRoomsView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfChatRoomsView():void + { + assertTrue("instance is ChatRoomsView", instance is ChatRoomsView); + } + + [Test] + public function instantiated_implementsIView():void + { + assertTrue("instance implements IView", instance is IView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/common/IMenuButtonsViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/common/IMenuButtonsViewTest.as new file mode 100644 index 0000000..6a36acb --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/common/IMenuButtonsViewTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages.common +{ + import org.flexunit.asserts.assertTrue; + + public class IMenuButtonsViewTest + { + protected var instance:IMenuButtonsView; + + [Before] + public function setUp():void + { + instance = new MenuButtonsView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMenuButtonsView():void + { + assertTrue("instance is IMenuButtonsView", instance is IMenuButtonsView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsConfigTest.as new file mode 100644 index 0000000..1069c62 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsConfigTest.as @@ -0,0 +1,102 @@ +package org.bigbluebutton.view.navigation.pages.common +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class MenuButtonsConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:MenuButtonsConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new MenuButtonsConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMenuButtonsConfig():void + { + assertTrue("instance is MenuButtonsConfig", instance is MenuButtonsConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IMenuButtonsView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IMenuButtonsView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsTest.as b/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsTest.as new file mode 100644 index 0000000..ff7c96a --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.common +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class MenuButtonsTest + { + protected var instance:MenuButtons; + + [Before] + public function setUp():void + { + instance = new MenuButtons(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMenuButtons():void + { + assertTrue("instance is MenuButtons", instance is MenuButtons); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewMediatorTest.as new file mode 100644 index 0000000..d966ee5 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewMediatorTest.as @@ -0,0 +1,93 @@ +package org.bigbluebutton.view.navigation.pages.common +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.core.DeskshareConnection; + import org.bigbluebutton.model.UserSession; + import org.bigbluebutton.model.UserUISession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class MenuButtonsViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:MenuButtonsView; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var isStreamingSignal:Signal; + + [Mock] + public var deskshareConnection:DeskshareConnection; + + [Mock] + public var userUISession:UserUISession; + + [Mock] + public var loadingSignal:Signal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:MenuButtonsViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(UserSession, DeskshareConnection, UserUISession, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new MenuButtonsViewMediator(); + + instance.userSession = this.userSession; + instance.view = this.view; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMenuButtonsViewMediator():void + { + assertTrue("instance is MenuButtonsViewMediator", instance is MenuButtonsViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userSession).getter("deskshareConnection").returns(this.deskshareConnection); + stub(instance.userSession.deskshareConnection).getter("isStreamingSignal").returns(this.isStreamingSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewTest.as new file mode 100644 index 0000000..92e161f --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/common/MenuButtonsViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation.pages.common +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class MenuButtonsViewTest + { + protected var instance:MenuButtonsView; + + [Before] + public function setUp():void + { + instance = new MenuButtonsView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMenuButtonsView():void + { + assertTrue("instance is MenuButtonsView", instance is MenuButtonsView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + + [Test] + public function instantiated_implementsIMenuButtonsView():void + { + assertTrue("instance implements IMenuButtonsView", instance is IMenuButtonsView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/common/VideoViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/common/VideoViewTest.as new file mode 100644 index 0000000..bba6ca9 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/common/VideoViewTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.common +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class VideoViewTest + { + protected var instance:VideoView; + + [Before] + public function setUp():void + { + instance = new VideoView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfVideoView():void + { + assertTrue("instance is VideoView", instance is VideoView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareConfigTest.as new file mode 100644 index 0000000..0493c95 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareConfigTest.as @@ -0,0 +1,102 @@ +package org.bigbluebutton.view.navigation.pages.deskshare +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class DeskshareConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:DeskshareConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new DeskshareConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDeskshareConfig():void + { + assertTrue("instance is DeskshareConfig", instance is DeskshareConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IDeskshareView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IDeskshareView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareVideoViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareVideoViewTest.as new file mode 100644 index 0000000..5efe559 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareVideoViewTest.as @@ -0,0 +1,42 @@ +package org.bigbluebutton.view.navigation.pages.deskshare +{ + import org.bigbluebutton.view.navigation.pages.common.VideoView; + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class DeskshareVideoViewTest + { + protected var instance:DeskshareVideoView; + + [Before] + public function setUp():void + { + instance = new DeskshareVideoView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDeskshareVideoView():void + { + assertTrue("instance is DeskshareVideoView", instance is DeskshareVideoView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + + [Test] + public function instantiated_extendsVideoView():void + { + assertTrue("instance extends VideoView", instance is VideoView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewBaseTest.as new file mode 100644 index 0000000..beed143 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.deskshare +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class DeskshareViewBaseTest + { + protected var instance:DeskshareViewBase; + + [Before] + public function setUp():void + { + instance = new DeskshareViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDeskshareViewBase():void + { + assertTrue("instance is DeskshareViewBase", instance is DeskshareViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewMediatorTest.as new file mode 100644 index 0000000..941ed5a --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewMediatorTest.as @@ -0,0 +1,91 @@ +package org.bigbluebutton.view.navigation.pages.deskshare +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.core.DeskshareConnection; + import org.bigbluebutton.model.IUserSession; + import org.bigbluebutton.model.UserSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class DeskshareViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:DeskshareView; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var deskshareConnection:DeskshareConnection; + + [Mock] + public var isStreamingSignal:Signal; + + [Mock] + public var mouseLocationChangedSignal:Signal + + private static var TIMEOUT:Number = 5000; + + protected var instance:DeskshareViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(DeskshareView, UserSession, Signal, DeskshareConnection), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new DeskshareViewMediator(); + + instance.userSession = this.userSession; + instance.view = this.view; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDeskshareViewMediator():void + { + assertTrue("instance is DeskshareViewMediator", instance is DeskshareViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userSession).getter("deskshareConnection").returns(this.deskshareConnection); + stub(instance.userSession.deskshareConnection).getter("isStreamingSignal").returns(this.isStreamingSignal); + stub(instance.userSession.deskshareConnection).getter("mouseLocationChangedSignal").returns(this.mouseLocationChangedSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewTest.as new file mode 100644 index 0000000..92cc56d --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/deskshare/DeskshareViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation.pages.deskshare +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class DeskshareViewTest + { + protected var instance:DeskshareView; + + [Before] + public function setUp():void + { + instance = new DeskshareView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDeskshareView():void + { + assertTrue("instance is DeskshareView", instance is DeskshareView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function instantiated_implementsIDeskshareView():void + { + assertTrue("instance implements IDeskshareView", instance is IDeskshareView); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/deskshare/IDeskshareViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/deskshare/IDeskshareViewTest.as new file mode 100644 index 0000000..04451ae --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/deskshare/IDeskshareViewTest.as @@ -0,0 +1,28 @@ +package org.bigbluebutton.view.navigation.pages.deskshare +{ + import org.bigbluebutton.core.view.IView; + import org.flexunit.asserts.assertTrue; + + public class IDeskshareViewTest + { + protected var instance:IDeskshareView; + + [Before] + public function setUp():void + { + instance = new DeskshareView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDeskshareView():void + { + assertTrue("instance is DeskshareView", instance is DeskshareView); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageConfigTest.as new file mode 100644 index 0000000..0078b95 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageConfigTest.as @@ -0,0 +1,102 @@ +package org.bigbluebutton.view.navigation.pages.disconnect +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class DisconnectPageConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:DisconnectPageConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new DisconnectPageConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDisconnectPageConfig():void + { + assertTrue("instance is DisconnectPageConfig", instance is DisconnectPageConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IDisconnectPageView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IDisconnectPageView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewBaseTest.as new file mode 100644 index 0000000..93c8a0a --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.disconnect +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class DisconnectPageViewBaseTest + { + protected var instance:DisconnectPageViewBase; + + [Before] + public function setUp():void + { + instance = new DisconnectPageViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDisconnectPageViewBase():void + { + assertTrue("instance is DisconnectPageViewBase", instance is DisconnectPageViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewMediatorTest.as new file mode 100644 index 0000000..ff92d97 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewMediatorTest.as @@ -0,0 +1,68 @@ +package org.bigbluebutton.view.navigation.pages.disconnect +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class DisconnectPageViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:DisconnectPageView; + + private static var TIMEOUT:Number = 5000; + + protected var instance:DisconnectPageViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(DisconnectPageView), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new DisconnectPageViewMediator(); + + instance.view = this.view; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDisconnectPageViewMediator():void + { + assertTrue("instance is DisconnectPageViewMediator", instance is DisconnectPageViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewTest.as new file mode 100644 index 0000000..145b65a --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/disconnect/DisconnectPageViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation.pages.disconnect +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class DisconnectPageViewTest + { + protected var instance:DisconnectPageView; + + [Before] + public function setUp():void + { + instance = new DisconnectPageView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDisconnectPageView():void + { + assertTrue("instance is DisconnectPageView", instance is DisconnectPageView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function instantiated_implementsIDisconnectPageView():void + { + assertTrue("instance implements IDisconnectPageView", instance is IDisconnectPageView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/disconnect/IDisconnectPageViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/disconnect/IDisconnectPageViewTest.as new file mode 100644 index 0000000..0167d05 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/disconnect/IDisconnectPageViewTest.as @@ -0,0 +1,28 @@ +package org.bigbluebutton.view.navigation.pages.disconnect +{ + import org.bigbluebutton.core.view.IView; + import org.flexunit.asserts.assertTrue; + + public class IDisconnectPageViewTest + { + protected var instance:IDisconnectPageView; + + [Before] + public function setUp():void + { + instance = new DisconnectPageView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDisconnectPageView():void + { + assertTrue("instance is DisconnectPageView", instance is DisconnectPageView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/disconnect/enum/DisconnectEnumTest.as b/tests/org/bigbluebutton/view/navigation/pages/disconnect/enum/DisconnectEnumTest.as new file mode 100644 index 0000000..f0e9ce1 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/disconnect/enum/DisconnectEnumTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages.disconnect.enum +{ + import org.flexunit.asserts.assertTrue; + + public class DisconnectEnumTest + { + protected var instance:DisconnectEnum; + + [Before] + public function setUp():void + { + instance = new DisconnectEnum(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDisconnectEnum():void + { + assertTrue("instance is DisconnectEnum", instance is DisconnectEnum); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/disconnect/enum/DisconnectTypeTest.as b/tests/org/bigbluebutton/view/navigation/pages/disconnect/enum/DisconnectTypeTest.as new file mode 100644 index 0000000..cbfef94 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/disconnect/enum/DisconnectTypeTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages.disconnect.enum +{ + import org.flexunit.asserts.assertTrue; + + public class DisconnectTypeTest + { + protected var instance:DisconnectType; + + [Before] + public function setUp():void + { + instance = new DisconnectType(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfDisconnectType():void + { + assertTrue("instance is DisconnectType", instance is DisconnectType); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/login/ILoginPageViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/login/ILoginPageViewTest.as new file mode 100644 index 0000000..168c2f0 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/login/ILoginPageViewTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages.login +{ + import org.flexunit.asserts.assertTrue; + + public class ILoginPageViewTest + { + protected var instance:ILoginPageView; + + [Before] + public function setUp():void + { + instance = new LoginPageView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoginPageView():void + { + assertTrue("instance is LoginPageView", instance is LoginPageView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageConfigTest.as new file mode 100644 index 0000000..97d01d1 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageConfigTest.as @@ -0,0 +1,102 @@ +package org.bigbluebutton.view.navigation.pages.login +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class LoginPageConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:LoginPageConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new LoginPageConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoginPageConfig():void + { + assertTrue("instance is LoginPageConfig", instance is LoginPageConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(ILoginPageView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(ILoginPageView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewBaseTest.as new file mode 100644 index 0000000..bc6580f --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.login +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class LoginPageViewBaseTest + { + protected var instance:LoginPageViewBase; + + [Before] + public function setUp():void + { + instance = new LoginPageViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoginPageViewBase():void + { + assertTrue("instance is LoginPageViewBase", instance is LoginPageViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewMediatorTest.as new file mode 100644 index 0000000..f82d244 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewMediatorTest.as @@ -0,0 +1,81 @@ +package org.bigbluebutton.view.navigation.pages.login +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.model.UserUISession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class LoginPageViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:LoginPageView; + + [Mock] + public var userUISession:UserUISession; + + [Mock] + public var unsuccessJoined:Signal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:LoginPageViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(LoginPageView, userUISession, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new LoginPageViewMediator(); + + instance.view = this.view; + instance.userUISession = this.userUISession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoginPageViewMediator():void + { + assertTrue("instance is LoginPageViewMediator", instance is LoginPageViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userUISession).getter("unsuccessJoined").returns(this.unsuccessJoined); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewTest.as new file mode 100644 index 0000000..73de0df --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/login/LoginPageViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation.pages.login +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class LoginPageViewTest + { + protected var instance:LoginPageView; + + [Before] + public function setUp():void + { + instance = new LoginPageView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoginPageView():void + { + assertTrue("instance is LoginPageView", instance is LoginPageView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function instantiated_implementsILoginPageView():void + { + assertTrue("instance implements ILoginPageView", instance is ILoginPageView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/participants/IParticipantsViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/participants/IParticipantsViewTest.as new file mode 100644 index 0000000..fc39aa5 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/participants/IParticipantsViewTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages.participants +{ + import org.flexunit.asserts.assertTrue; + + public class IParticipantsViewTest + { + protected var instance:IParticipantsView; + + [Before] + public function setUp():void + { + instance = new ParticipantsView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfParticipantsView():void + { + assertTrue("instance is ParticipantsView", instance is ParticipantsView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantItemRendererTest.as b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantItemRendererTest.as new file mode 100644 index 0000000..0597c7e --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantItemRendererTest.as @@ -0,0 +1,70 @@ +package org.bigbluebutton.view.navigation.pages.participants +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + + import org.bigbluebutton.model.User; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + + import spark.components.supportClasses.ItemRenderer; + + public class ParticipantItemRendererTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + private static var TIMEOUT:Number = 5000; + + [Mock] + public var user:User; + + protected var instance:ParticipantItemRenderer; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(User), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new ParticipantItemRenderer(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfParticipantItemRenderer():void + { + assertTrue("instance is ParticipantItemRenderer", instance is ParticipantItemRenderer); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark ItemRenderer component", instance is ItemRenderer); + } + + [Test] + public function setDataMethodCalledWhenUserIsNull_LabelTextIsEmpty():void + { + // Arrange + user = null; + + // Act + instance.data = user; + + // Assert + assertTrue("If User object is null, ParticipantItemRenderer's labelDisplay text property should be empty", instance.labelDisplay.text == ""); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsConfigTest.as new file mode 100644 index 0000000..d2c791b --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsConfigTest.as @@ -0,0 +1,102 @@ +package org.bigbluebutton.view.navigation.pages.participants +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class ParticipantsConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:ParticipantsConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new ParticipantsConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfParticipantsConfig():void + { + assertTrue("instance is ParticipantsConfig", instance is ParticipantsConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IParticipantsView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IParticipantsView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsListTest.as b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsListTest.as new file mode 100644 index 0000000..719ba5d --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsListTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.participants +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.List; + + public class ParticipantsListTest + { + protected var instance:ParticipantsList; + + [Before] + public function setUp():void + { + instance = new ParticipantsList(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfParticipantsList():void + { + assertTrue("instance is ParticipantsList", instance is ParticipantsList); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark List component", instance is List); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewBaseTest.as new file mode 100644 index 0000000..a00ee9c --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.participants +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class ParticipantsViewBaseTest + { + protected var instance:ParticipantsViewBase; + + [Before] + public function setUp():void + { + instance = new ParticipantsViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfParticipantsViewBase():void + { + assertTrue("instance is ParticipantsViewBase", instance is ParticipantsViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewMediatorTest.as new file mode 100644 index 0000000..95bb575 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewMediatorTest.as @@ -0,0 +1,95 @@ +package org.bigbluebutton.view.navigation.pages.participants +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.model.UserList; + import org.bigbluebutton.model.UserSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.ISignal; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class ParticipantsViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:ParticipantsView; + + [Mock] + public var userList:UserList; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var userChangeSignal:Signal; + + [Mock] + public var userAddedSignal:Signal; + + [Mock] + public var userRemovedSignal:Signal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:ParticipantsViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(ParticipantsView, UserSession, UserList, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new ParticipantsViewMediator(); + + instance.view = this.view; + instance.userSession = this.userSession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfParticipantsViewMediator():void + { + assertTrue("instance is ParticipantsViewMediator", instance is ParticipantsViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userSession).getter("userList").returns(this.userList); + stub(instance.userSession.userList).getter("userChangeSignal").returns(this.userChangeSignal); + stub(instance.userSession.userList).getter("userAddedSignal").returns(this.userAddedSignal); + stub(instance.userSession.userList).getter("userRemovedSignal").returns(this.userRemovedSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewTest.as new file mode 100644 index 0000000..11d6a0d --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/participants/ParticipantsViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation.pages.participants +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class ParticipantsViewTest + { + protected var instance:ParticipantsView; + + [Before] + public function setUp():void + { + instance = new ParticipantsView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfParticipantsView():void + { + assertTrue("instance is ParticipantsView", instance is ParticipantsView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function instantiated_implementsIParticipantsView():void + { + assertTrue("instance implements IParticipantsView", instance is IParticipantsView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/presentation/IPresentationViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/presentation/IPresentationViewTest.as new file mode 100644 index 0000000..5a0c74a --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/presentation/IPresentationViewTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages.presentation +{ + import org.flexunit.asserts.assertTrue; + + public class IPresentationViewTest + { + protected var instance:IPresentationView; + + [Before] + public function setUp():void + { + instance = new PresentationView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPresentationView():void + { + assertTrue("instance is PresentationView", instance is PresentationView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationConfigTest.as new file mode 100644 index 0000000..23e4df1 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationConfigTest.as @@ -0,0 +1,102 @@ +package org.bigbluebutton.view.navigation.pages.presentation +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class PresentationConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:PresentationConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new PresentationConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPresentationConfig():void + { + assertTrue("instance is PresentationConfig", instance is PresentationConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IPresentationView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IPresentationView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewBaseTest.as new file mode 100644 index 0000000..4d1d532 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.presentation +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class PresentationViewBaseTest + { + protected var instance:PresentationViewBase; + + [Before] + public function setUp():void + { + instance = new PresentationViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPresentationViewBase():void + { + assertTrue("instance is PresentationViewBase", instance is PresentationViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewMediatorTest.as new file mode 100644 index 0000000..0de862e --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewMediatorTest.as @@ -0,0 +1,86 @@ +package org.bigbluebutton.view.navigation.pages.presentation +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.model.UserSession; + import org.bigbluebutton.model.presentation.PresentationList; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class PresentationViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:PresentationView; + + [Mock] + public var presentationList:PresentationList; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var presentationChangeSignal:Signal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:PresentationViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(PresentationView, UserSession, PresentationList, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new PresentationViewMediator(); + + instance.view = this.view; + instance.userSession = this.userSession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPresentationViewMediator():void + { + assertTrue("instance is PresentationViewMediator", instance is PresentationViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userSession).getter("presentationList").returns(this.presentationList); + stub(instance.userSession.presentationList).getter("presentationChangeSignal").returns(this.presentationChangeSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewTest.as new file mode 100644 index 0000000..e6ae016 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/presentation/PresentationViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation.pages.presentation +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class PresentationViewTest + { + protected var instance:PresentationView; + + [Before] + public function setUp():void + { + instance = new PresentationView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfPresentationView():void + { + assertTrue("instance is PresentationView", instance is PresentationView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function instantiated_implementsIPresentationView():void + { + assertTrue("instance implements IPresentationView", instance is IPresentationView); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/profile/IProfileViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/profile/IProfileViewTest.as new file mode 100644 index 0000000..dd5d570 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/profile/IProfileViewTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages.profile +{ + import org.flexunit.asserts.assertTrue; + + public class IProfileViewTest + { + protected var instance:IProfileView; + + [Before] + public function setUp():void + { + instance = new ProfileView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfProfileView():void + { + assertTrue("instance is ProfileView", instance is ProfileView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileConfigTest.as new file mode 100644 index 0000000..0dd18de --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileConfigTest.as @@ -0,0 +1,138 @@ +package org.bigbluebutton.view.navigation.pages.profile +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.command.RaiseHandSignal; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.osflash.signals.Signal; + + import robotlegs.bender.extensions.commandCenter.dsl.ICommandMapper; + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class ProfileConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + [Mock] + public var commandMapper:ICommandMapper; + + private static var TIMEOUT:Number = 5000; + + protected var instance:ProfileConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper, ICommandMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new ProfileConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfProfileConfig():void + { + assertTrue("instance is ProfileConfig", instance is ProfileConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IProfileView).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(RaiseHandSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IProfileView).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(RaiseHandSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + [Test] + public function executed_callsSignalCommandMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IProfileView).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(RaiseHandSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.signalCommandMap, received().method('map')); + } + + [Test] + public function executed_callsCommandMapperToCommandMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IProfileView).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(RaiseHandSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(commandMapper, received().method('toCommand')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewBaseTest.as new file mode 100644 index 0000000..3ea7d8d --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.profile +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class ProfileViewBaseTest + { + protected var instance:ProfileViewBase; + + [Before] + public function setUp():void + { + instance = new ProfileViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfProfileViewBase():void + { + assertTrue("instance is ProfileViewBase", instance is ProfileViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewMediatorTest.as new file mode 100644 index 0000000..af1238d --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewMediatorTest.as @@ -0,0 +1,110 @@ +package org.bigbluebutton.view.navigation.pages.profile +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.model.UserList; + import org.bigbluebutton.model.UserSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + import spark.components.Button; + import spark.components.RadioButtonGroup; + + public class ProfileViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:ProfileView; + + [Mock] + public var userList:UserList; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var userChangeSignal:Signal; + + [Mock] + public var shareCameraButton:Button; + + [Mock] + public var shareMicButton:Button; + + [Mock] + public var cameraQualityRadioGroup:RadioButtonGroup; + + [Mock] + public var raiseHandButton:Button; + + [Mock] + public var logoutButton:Button; + + private static var TIMEOUT:Number = 5000; + + protected var instance:ProfileViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(ProfileView, UserSession, UserList, Signal, Button, RadioButtonGroup), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new ProfileViewMediator(); + + instance.view = this.view; + instance.userSession = this.userSession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfProfileViewMediator():void + { + assertTrue("instance is ProfileViewMediator", instance is ProfileViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.view).getter("shareCameraButton").returns(this.shareCameraButton); + stub(instance.view).getter("shareMicButton").returns(this.shareMicButton); + stub(instance.view).getter("raiseHandButton").returns(this.raiseHandButton); + stub(instance.view).getter("cameraQualityRadioGroup").returns(this.cameraQualityRadioGroup); + stub(instance.view).getter("logoutButton").returns(this.logoutButton); + + stub(instance.userSession).getter("userList").returns(this.userList); + stub(instance.userSession.userList).getter("userChangeSignal").returns(this.userChangeSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewTest.as new file mode 100644 index 0000000..aef4e62 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/profile/ProfileViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation.pages.profile +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class ProfileViewTest + { + protected var instance:ProfileView; + + [Before] + public function setUp():void + { + instance = new ProfileView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfProfileView():void + { + assertTrue("instance is ProfileView", instance is ProfileView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function instantiated_implementsIProfileView():void + { + assertTrue("instance implements IProfileView", instance is IProfileView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/ISelectParticipantViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/ISelectParticipantViewTest.as new file mode 100644 index 0000000..f615e2a --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/ISelectParticipantViewTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages.selectparticipant +{ + import org.flexunit.asserts.assertTrue; + + public class ISelectParticipantViewTest + { + protected var instance:ISelectParticipantView; + + [Before] + public function setUp():void + { + instance = new SelectParticipantView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSelectParticipantView():void + { + assertTrue("instance is SelectParticipantView", instance is SelectParticipantView); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantConfigTest.as new file mode 100644 index 0000000..306cf20 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantConfigTest.as @@ -0,0 +1,102 @@ +package org.bigbluebutton.view.navigation.pages.selectparticipant +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class SelectParticipantConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:SelectParticipantConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new SelectParticipantConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSelectParticipantConfig():void + { + assertTrue("instance is SelectParticipantConfig", instance is SelectParticipantConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(ISelectParticipantView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(ISelectParticipantView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantItemRendererTest.as b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantItemRendererTest.as new file mode 100644 index 0000000..24d8144 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantItemRendererTest.as @@ -0,0 +1,70 @@ +package org.bigbluebutton.view.navigation.pages.selectparticipant +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + + import org.bigbluebutton.model.User; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + + import spark.components.supportClasses.ItemRenderer; + + public class SelectParticipantItemRendererTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + private static var TIMEOUT:Number = 5000; + + [Mock] + public var user:User; + + protected var instance:SelectParticipantItemRenderer; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(User), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new SelectParticipantItemRenderer(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSelectParticipantItemRenderer():void + { + assertTrue("instance is SelectParticipantItemRenderer", instance is SelectParticipantItemRenderer); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark ItemRenderer component", instance is ItemRenderer); + } + + [Test] + public function setDataMethodCalledWhenUserIsNull_LabelTextIsEmpty():void + { + // Arrange + user = null; + + // Act + instance.data = user; + + // Assert + assertTrue("If User object is null, SelectParticipantItemRenderer's labelDisplay text property should be empty", instance.labelDisplay.text == ""); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantListTest.as b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantListTest.as new file mode 100644 index 0000000..477bbe0 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantListTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.selectparticipant +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.List; + + public class SelectParticipantListTest + { + protected var instance:SelectParticipantList; + + [Before] + public function setUp():void + { + instance = new SelectParticipantList(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSelectParticipantList():void + { + assertTrue("instance is SelectParticipantList", instance is SelectParticipantList); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark List component", instance is List); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewBaseTest.as new file mode 100644 index 0000000..cd2242e --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.selectparticipant +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class SelectParticipantViewBaseTest + { + protected var instance:SelectParticipantViewBase; + + [Before] + public function setUp():void + { + instance = new SelectParticipantViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSelectParticipantViewBase():void + { + assertTrue("instance is SelectParticipantViewBase", instance is SelectParticipantViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewMediatorTest.as new file mode 100644 index 0000000..a91853f --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewMediatorTest.as @@ -0,0 +1,94 @@ +package org.bigbluebutton.view.navigation.pages.selectparticipant +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.model.UserList; + import org.bigbluebutton.model.UserSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class SelectParticipantViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:SelectParticipantView; + + [Mock] + public var userList:UserList; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var userChangeSignal:Signal; + + [Mock] + public var userAddedSignal:Signal; + + [Mock] + public var userRemovedSignal:Signal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:SelectParticipantViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(SelectParticipantView, UserSession, UserList, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new SelectParticipantViewMediator(); + + instance.view = this.view; + instance.userSession = this.userSession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSelectParticipantViewMediator():void + { + assertTrue("instance is SelectParticipantViewMediator", instance is SelectParticipantViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userSession).getter("userList").returns(this.userList); + stub(instance.userSession.userList).getter("userChangeSignal").returns(this.userChangeSignal); + stub(instance.userSession.userList).getter("userAddedSignal").returns(this.userAddedSignal); + stub(instance.userSession.userList).getter("userRemovedSignal").returns(this.userRemovedSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewTest.as new file mode 100644 index 0000000..3178c8f --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/selectparticipant/SelectParticipantViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation.pages.selectparticipant +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class SelectParticipantViewTest + { + protected var instance:SelectParticipantView; + + [Before] + public function setUp():void + { + instance = new SelectParticipantView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSelectParticipantView():void + { + assertTrue("instance is SelectParticipantView", instance is SelectParticipantView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function instantiated_implementsISelectParticipantView():void + { + assertTrue("instance implements ISelectParticipantView", instance is ISelectParticipantView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/userdetails/IUserDetailsViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/userdetails/IUserDetailsViewTest.as new file mode 100644 index 0000000..25b92a7 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/userdetails/IUserDetailsViewTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages.userdetails +{ + import org.flexunit.asserts.assertTrue; + + public class IUserDetailsViewTest + { + protected var instance:IUserDetailsView; + + [Before] + public function setUp():void + { + instance = new UserDetailsView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUserDetailsView():void + { + assertTrue("instance is UserDetailsView", instance is UserDetailsView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsConfigTest.as new file mode 100644 index 0000000..74f4fd7 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsConfigTest.as @@ -0,0 +1,102 @@ +package org.bigbluebutton.view.navigation.pages.userdetails +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class UserDetailsConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:UserDetailsConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new UserDetailsConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUserDetailsConfig():void + { + assertTrue("instance is UserDetailsConfig", instance is UserDetailsConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IUserDetailsView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IUserDetailsView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewBaseTest.as new file mode 100644 index 0000000..dc93717 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.userdetails +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class UserDetailsViewBaseTest + { + protected var instance:UserDetailsViewBase; + + [Before] + public function setUp():void + { + instance = new UserDetailsViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUserDetailsViewBase():void + { + assertTrue("instance is UserDetailsViewBase", instance is UserDetailsViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewMediatorTest.as new file mode 100644 index 0000000..bd974e7 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewMediatorTest.as @@ -0,0 +1,100 @@ +package org.bigbluebutton.view.navigation.pages.userdetails +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.model.UserList; + import org.bigbluebutton.model.UserSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + import spark.components.Button; + + public class UserDetailsViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:UserDetailsView; + + [Mock] + public var userList:UserList; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var userChangeSignal:Signal; + + [Mock] + public var userRemovedSignal:Signal; + + [Mock] + public var showCameraButton:Button; + + [Mock] + public var showPrivateChatButton:Button; + + private static var TIMEOUT:Number = 5000; + + protected var instance:UserDetailsViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(UserDetailsView, UserSession, UserList, Signal, Button), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new UserDetailsViewMediator(); + + instance.view = this.view; + instance.userSession = this.userSession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUserDetailsViewMediator():void + { + assertTrue("instance is UserDetailsViewMediator", instance is UserDetailsViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userSession).getter("userList").returns(this.userList); + stub(instance.userSession.userList).getter("userChangeSignal").returns(this.userChangeSignal); + stub(instance.userSession.userList).getter("userRemovedSignal").returns(this.userRemovedSignal); + stub(instance.view).getter("showCameraButton").returns(this.showCameraButton); + stub(instance.view).getter("showPrivateChat").returns(this.showPrivateChatButton); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewTest.as new file mode 100644 index 0000000..601e4c1 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/userdetails/UserDetailsViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation.pages.userdetails +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class UserDetailsViewTest + { + protected var instance:UserDetailsView; + + [Before] + public function setUp():void + { + instance = new UserDetailsView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfUserDetailsView():void + { + assertTrue("instance is UserDetailsView", instance is UserDetailsView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function instantiated_implementsIUserDetailsView():void + { + assertTrue("instance implements IUserDetailsView", instance is IUserDetailsView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/videochat/IVideoChatViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/videochat/IVideoChatViewTest.as new file mode 100644 index 0000000..6db069d --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/videochat/IVideoChatViewTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.navigation.pages.videochat +{ + import org.flexunit.asserts.assertTrue; + + public class IVideoChatViewTest + { + protected var instance:IVideoChatView; + + [Before] + public function setUp():void + { + instance = new VideoChatView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfVideoChatView():void + { + assertTrue("instance is VideoChatView", instance is VideoChatView); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatConfigTest.as b/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatConfigTest.as new file mode 100644 index 0000000..80bf9e6 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatConfigTest.as @@ -0,0 +1,108 @@ +package org.bigbluebutton.view.navigation.pages.videochat +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.command.RaiseHandSignal; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.osflash.signals.Signal; + + import robotlegs.bender.extensions.commandCenter.dsl.ICommandMapper; + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class VideoChatConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + [Mock] + public var commandMapper:ICommandMapper; + + private static var TIMEOUT:Number = 5000; + + protected var instance:VideoChatConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper, ICommandMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new VideoChatConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfVideoChatConfig():void + { + assertTrue("instance is VideoChatConfig", instance is VideoChatConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IVideoChatView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IVideoChatView).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatVideoViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatVideoViewTest.as new file mode 100644 index 0000000..f4afb66 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatVideoViewTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.videochat +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class VideoChatVideoViewTest + { + protected var instance:VideoChatVideoView; + + [Before] + public function setUp():void + { + instance = new VideoChatVideoView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfVideoChatVideoView():void + { + assertTrue("instance is VideoChatVideoView", instance is VideoChatVideoView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewBaseTest.as b/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewBaseTest.as new file mode 100644 index 0000000..5b71cc7 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.navigation.pages.videochat +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class VideoChatViewBaseTest + { + protected var instance:VideoChatViewBase; + + [Before] + public function setUp():void + { + instance = new VideoChatViewBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfVideoChatViewBase():void + { + assertTrue("instance is VideoChatViewBase", instance is VideoChatViewBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediatorTest.as new file mode 100644 index 0000000..33639a5 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediatorTest.as @@ -0,0 +1,105 @@ +package org.bigbluebutton.view.navigation.pages.videochat +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.model.UserList; + import org.bigbluebutton.model.UserSession; + import org.bigbluebutton.model.UserUISession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.ISignal; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class VideoChatViewMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:VideoChatView; + + [Mock] + public var userList:UserList; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var userUISession:UserUISession; + + [Mock] + public var userChangeSignal:Signal; + + [Mock] + public var userAddedSignal:Signal; + + [Mock] + public var userRemovedSignal:Signal; + + [Mock] + public var pageTransitionStartSignal:ISignal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:VideoChatViewMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(VideoChatView, UserSession, UserList, Signal, UserUISession), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new VideoChatViewMediator(); + + instance.view = this.view; + instance.userSession = this.userSession; + instance.userUISession = this.userUISession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfVideoChatViewMediator():void + { + assertTrue("instance is VideoChatViewMediator", instance is VideoChatViewMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userSession).getter("userList").returns(this.userList); + stub(instance.userSession.userList).getter("userChangeSignal").returns(this.userChangeSignal); + stub(instance.userSession.userList).getter("userAddedSignal").returns(this.userAddedSignal); + stub(instance.userSession.userList).getter("userRemovedSignal").returns(this.userRemovedSignal); + + stub(instance.userUISession).getter("pageTransitionStartSignal").returns(this.pageTransitionStartSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewTest.as b/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewTest.as new file mode 100644 index 0000000..a72b4b2 --- /dev/null +++ b/tests/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.navigation.pages.videochat +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.View; + + public class VideoChatViewTest + { + protected var instance:VideoChatView; + + [Before] + public function setUp():void + { + instance = new VideoChatView(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfVideoChatView():void + { + assertTrue("instance is VideoChatView", instance is VideoChatView); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark View component", instance is View); + } + + [Test] + public function instantiated_implementsIVideoChatView():void + { + assertTrue("instance implements IVideoChatView", instance is IVideoChatView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/skins/BBBLogoSkinTest.as b/tests/org/bigbluebutton/view/skins/BBBLogoSkinTest.as new file mode 100644 index 0000000..f9e305c --- /dev/null +++ b/tests/org/bigbluebutton/view/skins/BBBLogoSkinTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.skins +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class BBBLogoSkinTest + { + protected var instance:BBBLogoSkin; + + [Before] + public function setUp():void + { + instance = new BBBLogoSkin(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfBBBLogoSkin():void + { + assertTrue("instance is BBBLogoSkin", instance is BBBLogoSkin); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/skins/CommonButtonSkinTest.as b/tests/org/bigbluebutton/view/skins/CommonButtonSkinTest.as new file mode 100644 index 0000000..2418bb7 --- /dev/null +++ b/tests/org/bigbluebutton/view/skins/CommonButtonSkinTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.skins +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class CommonButtonSkinTest + { + protected var instance:CommonButtonSkin; + + [Before] + public function setUp():void + { + instance = new CommonButtonSkin(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfCommonButtonSkin():void + { + assertTrue("instance is CommonButtonSkin", instance is CommonButtonSkin); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} diff --git a/tests/org/bigbluebutton/view/skins/IconSkinTest.as b/tests/org/bigbluebutton/view/skins/IconSkinTest.as new file mode 100644 index 0000000..a4bf73b --- /dev/null +++ b/tests/org/bigbluebutton/view/skins/IconSkinTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.skins +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class IconSkinTest + { + protected var instance:IconSkin; + + [Before] + public function setUp():void + { + instance = new IconSkin(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfIconSkin():void + { + assertTrue("instance is IconSkin", instance is IconSkin); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} diff --git a/tests/org/bigbluebutton/view/skins/LogoutButtonSkinTest.as b/tests/org/bigbluebutton/view/skins/LogoutButtonSkinTest.as new file mode 100644 index 0000000..54e9eda --- /dev/null +++ b/tests/org/bigbluebutton/view/skins/LogoutButtonSkinTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.skins +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class LogoutButtonSkinTest + { + protected var instance:LogoutButtonSkin; + + [Before] + public function setUp():void + { + instance = new LogoutButtonSkin(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLogoutButtonSkin():void + { + assertTrue("instance is LogoutButtonSkin", instance is LogoutButtonSkin); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} diff --git a/tests/org/bigbluebutton/view/skins/NavigationButtonSkinTest.as b/tests/org/bigbluebutton/view/skins/NavigationButtonSkinTest.as new file mode 100644 index 0000000..075d749 --- /dev/null +++ b/tests/org/bigbluebutton/view/skins/NavigationButtonSkinTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.skins +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class NavigationButtonSkinTest + { + protected var instance:NavigationButtonSkin; + + [Before] + public function setUp():void + { + instance = new NavigationButtonSkin(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfNavigationButtonSkin():void + { + assertTrue("instance is NavigationButtonSkin", instance is NavigationButtonSkin); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/skins/ProfileSettingsButtonSkinTest.as b/tests/org/bigbluebutton/view/skins/ProfileSettingsButtonSkinTest.as new file mode 100644 index 0000000..8e3e57f --- /dev/null +++ b/tests/org/bigbluebutton/view/skins/ProfileSettingsButtonSkinTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.skins +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class ProfileSettingsButtonSkinTest + { + protected var instance:ProfileSettingsButtonSkin; + + [Before] + public function setUp():void + { + instance = new ProfileSettingsButtonSkin(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfProfileSettingsButtonSkin():void + { + assertTrue("instance is ProfileSettingsButtonSkin", instance is ProfileSettingsButtonSkin); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/skins/ProfileViewContainerSkinTest.as b/tests/org/bigbluebutton/view/skins/ProfileViewContainerSkinTest.as new file mode 100644 index 0000000..31696be --- /dev/null +++ b/tests/org/bigbluebutton/view/skins/ProfileViewContainerSkinTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.skins +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class ProfileViewContainerSkinTest + { + protected var instance:ProfileViewContainerSkin; + + [Before] + public function setUp():void + { + instance = new ProfileViewContainerSkin(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfProfileViewContainerSkin():void + { + assertTrue("instance is ProfileViewContainerSkin", instance is ProfileViewContainerSkin); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/skins/RadioButtonSkinTest.as b/tests/org/bigbluebutton/view/skins/RadioButtonSkinTest.as new file mode 100644 index 0000000..3367ba4 --- /dev/null +++ b/tests/org/bigbluebutton/view/skins/RadioButtonSkinTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.skins +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class RadioButtonSkinTest + { + protected var instance:RadioButtonSkin; + + [Before] + public function setUp():void + { + instance = new RadioButtonSkin(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfRadioButtonSkin():void + { + assertTrue("instance is RadioButtonSkin", instance is RadioButtonSkin); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/skins/TopButtonSkinTest.as b/tests/org/bigbluebutton/view/skins/TopButtonSkinTest.as new file mode 100644 index 0000000..3b5b424 --- /dev/null +++ b/tests/org/bigbluebutton/view/skins/TopButtonSkinTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.skins +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class TopButtonSkinTest + { + protected var instance:TopButtonSkin; + + [Before] + public function setUp():void + { + instance = new TopButtonSkin(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfTopButtonSkin():void + { + assertTrue("instance is TopButtonSkin", instance is TopButtonSkin); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/BackButtonTest.as b/tests/org/bigbluebutton/view/ui/BackButtonTest.as new file mode 100644 index 0000000..d73a204 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/BackButtonTest.as @@ -0,0 +1,42 @@ +package org.bigbluebutton.view.ui +{ + import org.flexunit.asserts.assertFalse; + import org.flexunit.asserts.assertTrue; + + import spark.components.Button; + + public class MicButtonTest + { + protected var instance:MicButton; + + [Before] + public function setUp():void + { + instance = new MicButton(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMicButton():void + { + assertTrue("instance is MicButton", instance is MicButton); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Button component", instance is Button); + } + + [Test] + public function instantiated_implementsIMicButton():void + { + assertTrue("instance implements IMicButton", instance is IMicButton); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/IMicButtonTest.as b/tests/org/bigbluebutton/view/ui/IMicButtonTest.as new file mode 100644 index 0000000..07db3c6 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/IMicButtonTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.view.ui +{ + import org.bigbluebutton.core.view.IView; + import org.flexunit.asserts.assertTrue; + + public class IMicButtonTest + { + protected var instance:IMicButton; + + [Before] + public function setUp():void + { + instance = new MicButton(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMicButton():void + { + assertTrue("instance is MicButton", instance is MicButton); + } + + [Test] + public function instantiated_implementsIView():void + { + assertTrue("instance implements IView", instance is IView); + } + } +} diff --git a/tests/org/bigbluebutton/view/ui/INavigationButtonTest.as b/tests/org/bigbluebutton/view/ui/INavigationButtonTest.as new file mode 100644 index 0000000..e8a6432 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/INavigationButtonTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.view.ui +{ + import org.bigbluebutton.core.view.IView; + import org.flexunit.asserts.assertTrue; + + public class INavigationButtonTest + { + protected var instance:INavigationButton; + + [Before] + public function setUp():void + { + instance = new NavigationButton(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfNavigationButton():void + { + assertTrue("instance is NavigationButton", instance is NavigationButton); + } + + [Test] + public function instantiated_implementsIView():void + { + assertTrue("instance implements IView", instance is IView); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/ISwapCameraButtonTest.as b/tests/org/bigbluebutton/view/ui/ISwapCameraButtonTest.as new file mode 100644 index 0000000..ce3fde3 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/ISwapCameraButtonTest.as @@ -0,0 +1,34 @@ +package org.bigbluebutton.view.ui +{ + import org.bigbluebutton.core.view.IView; + import org.flexunit.asserts.assertTrue; + + public class ISwapCameraButtonTest + { + protected var instance:ISwapCameraButton; + + [Before] + public function setUp():void + { + instance = new SwapCameraButton(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSwapCameraButton():void + { + assertTrue("instance is SwapCameraButton", instance is SwapCameraButton); + } + + [Test] + public function instantiated_implementsIView():void + { + assertTrue("instance implements IView", instance is IView); + } + } +} diff --git a/tests/org/bigbluebutton/view/ui/MicButtonConfigTest.as b/tests/org/bigbluebutton/view/ui/MicButtonConfigTest.as new file mode 100644 index 0000000..b79fc29 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/MicButtonConfigTest.as @@ -0,0 +1,137 @@ +package org.bigbluebutton.view.ui +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.command.MicrophoneMuteSignal; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.commandCenter.dsl.ICommandMapper; + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class MicButtonConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + [Mock] + public var commandMapper:ICommandMapper; + + private static var TIMEOUT:Number = 5000; + + protected var instance:MicButtonConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper, ICommandMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new MicButtonConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMicButtonConfig():void + { + assertTrue("instance is MicButtonConfig", instance is MicButtonConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IMicButton).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(MicrophoneMuteSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IMicButton).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(MicrophoneMuteSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + [Test] + public function executed_callsSignalCommandMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IMicButton).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(MicrophoneMuteSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.signalCommandMap, received().method('map')); + } + + [Test] + public function executed_callsCommandMapperToCommandMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(IMicButton).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(MicrophoneMuteSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(commandMapper, received().method('toCommand')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/MicButtonConfigTests.as b/tests/org/bigbluebutton/view/ui/MicButtonConfigTests.as deleted file mode 100644 index dbc7f4c..0000000 --- a/tests/org/bigbluebutton/view/ui/MicButtonConfigTests.as +++ /dev/null @@ -1,19 +0,0 @@ -package org.bigbluebutton.view.ui -{ - import org.hamcrest.assertThat; - import org.hamcrest.object.notNullValue; - - import robotlegs.bender.framework.api.IConfig; - - public class MicButtonConfigTests - { - /** - * Tests that the TodoFormConfig class implements IConfig. - */ - [Test] - public function implements_expectedInterface(): void - { - assertThat(new MicButtonConfig() as IConfig, notNullValue()); - } - } -} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/MicButtonMediatorTest.as b/tests/org/bigbluebutton/view/ui/MicButtonMediatorTest.as new file mode 100644 index 0000000..e655c11 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/MicButtonMediatorTest.as @@ -0,0 +1,87 @@ +package org.bigbluebutton.view.ui +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.model.UserList; + import org.bigbluebutton.model.UserSession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.ISignal; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class MicButtonMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:MicButton; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var userList:UserList; + + [Mock] + public var userChangeSignal:ISignal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:MicButtonMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(MicButton, UserSession, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new MicButtonMediator(); + + instance.view = this.view; + instance.userSession = this.userSession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMicButtonMediator():void + { + assertTrue("instance is MicButtonMediator", instance is MicButtonMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userSession).getter("userList").returns(this.userList); + stub(instance.userSession.userList).getter("userChangeSignal").returns(this.userChangeSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/MicButtonMediatorTests.as b/tests/org/bigbluebutton/view/ui/MicButtonMediatorTests.as deleted file mode 100644 index 26bbda6..0000000 --- a/tests/org/bigbluebutton/view/ui/MicButtonMediatorTests.as +++ /dev/null @@ -1,94 +0,0 @@ -package org.bigbluebutton.view.ui -{ - import org.hamcrest.assertThat; - import org.hamcrest.object.isTrue; - import org.bigbluebutton.command.MicrophoneOnSignal; - import org.bigbluebutton.testing.MediatorTests; - import org.mockito.integrations.flexunit4.MockitoRule; - import org.mockito.integrations.given; - import org.mockito.integrations.mock; - import org.mockito.integrations.times; - import org.mockito.integrations.verify; - import org.osflash.signals.Signal; - - [Mock(type="org.bigbluebutton.command.TurnOnMicSignal")] - [Mock(type="org.bigbluebutton.command.TurnOffMicSignal")] - [Mock(type="org.bigbluebutton.view.mic.api.IMicButton")] - [Mock(type="robotlegs.bender.extensions.localEventMap.api.IEventMap")] - public class MicButtonMediatorTests extends MediatorTests - { - private var _micButton: IMicButton; - - [Rule] - public var mockitoRule: MockitoRule = new MockitoRule(); - - /** - * Tests when the mediator is destroyed the - * view is disposed of. - */ - [Test] - public function destory_ViewIsDisposed(): void - { - var micButtonMediator: MicButtonMediator = createMediator(); - micButtonMediator.destroy(); - verify(times(1)).that(_micButton.dispose()); - } - - /** - * Tests when the mediator is destory the dependencies - * are nullified. - */ - [Test] - public function destory_NullifiesDependencies(): void - { - var micButtonMediator: MicButtonMediator = createMediator(); - micButtonMediator.destroy(); - assertThat(!micButtonMediator.view, isTrue()); - } - - /** - * Creates the test subject with its dependencies. - */ - private function createMediator(obj: * = null): MicButtonMediator - { - var micButtonMediator: MicButtonMediator = new MicButtonMediator(); - micButtonMediator.view = createMockOfMicButton(); - micButtonMediator.microphoneEnableSignal = mock(MicrophoneOnSignal); - - //given(micButtonMediator.view.turnOffMicSignal).willReturn(activeTodo); - - setupMediator(micButtonMediator); - - micButtonMediator.initialize(); - - return micButtonMediator; - } - - /** - * Creates a mock of the TodoFormView with its signals set. - */ - private function createMockOfMicButton(): IMicButton - { - _micButton = mock(IMicButton); - given(_micButton.turnOffMicSignal).willReturn(new Signal()); - given(_micButton.turnOnMicSignal).willReturn(new Signal()); - return _micButton; - } - - /** - * Simulates the user wanting to cancel the todo form. - */ - private function simulateTurnOffMic(): void - { - (_micButton.turnOffMicSignal as Signal).dispatch(); - } - - /** - * Simulates the user wanting to cancel the todo form. - */ - private function simulateTurnOnMic(): void - { - (_micButton.turnOnMicSignal as Signal).dispatch(); - } - } -} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/MicButtonTest.as b/tests/org/bigbluebutton/view/ui/MicButtonTest.as new file mode 100644 index 0000000..4d6f84e --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/MicButtonTest.as @@ -0,0 +1,48 @@ +package org.bigbluebutton.view.ui +{ + import org.flexunit.asserts.assertFalse; + import org.flexunit.asserts.assertTrue; + + import spark.components.Button; + + public class MicButtonTest + { + protected var instance:MicButton; + + [Before] + public function setUp():void + { + instance = new MicButton(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfMicButton():void + { + assertTrue("instance is MicButton", instance is MicButton); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Button component", instance is Button); + } + + [Test] + public function instantiated_implementsIMicButton():void + { + assertTrue("instance implements IMicButton", instance is IMicButton); + } + + [Test] + public function instantiated_visibleByDefault():void + { + assertTrue("Mic button is visible by default", instance.visible); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/MicButtonTests.as b/tests/org/bigbluebutton/view/ui/MicButtonTests.as deleted file mode 100644 index 2dd6cba..0000000 --- a/tests/org/bigbluebutton/view/ui/MicButtonTests.as +++ /dev/null @@ -1,110 +0,0 @@ -package org.bigbluebutton.view.ui -{ - import flash.events.MouseEvent; - - import org.fluint.uiImpersonation.UIImpersonator; - import org.hamcrest.assertThat; - import org.hamcrest.object.equalTo; - import org.hamcrest.object.isFalse; - import org.hamcrest.object.isTrue; - import org.hamcrest.object.notNullValue; - import org.bigbluebutton.testing.ViewTests; - import org.osflash.signals.utils.proceedOnSignal; - - - public class MicButtonTests extends ViewTests - { - [After] - override public function after(): void - { - //super.after(); - UIImpersonator.removeAllElements(); - } - - /** - * Tests that the MicButton implements ITemplateView. - */ - [Test] - public function implements_expectedInterface(): void - { - assertThat(createView() as IMicButton, notNullValue()); - } - - /** - * By default the turnOnMicrofoneSignal should not be null. - */ - [Test] - public function default_turnOnMicSignalIsNotNull(): void - { - assertThat(createView().turnOnMicSignal, notNullValue()); - } - - /** - * By default the turnOffMicrofoneSignal should not be null. - */ - [Test] - public function default_turnOffMicSignalIsNotNull(): void - { - assertThat(createView().turnOffMicSignal, notNullValue()); - } - - /** - * By default the MicButton should not be enabled. - */ - [Test] - public function default_micButtonShouldBeDisabled(): void - { - assertThat(createView().enabled, isTrue()); - } - - /** - * Tests that when the MicButton is clicked the turnOnMicSignal - * is dispatched. - */ - [Test(async)] - public function clickCancelButton_DispatchesCancelSignal(): void - { - var micButton: MicButton = createView(); - proceedOnSignal(this, micButton.turnOffMicSignal); - click(micButton); - } - - /** - * Disposing of the view should remove all the listeners on the - * turnOffMicSignal. - */ - [Test] - public function dispose_RemovesListenersToTurnOffMicSignal(): void - { - var micButton: MicButton = createView(); - micButton.turnOffMicSignal.add(dummyMethod); - micButton.dispose(); - - assertThat(micButton.turnOffMicSignal.numListeners, equalTo(0)); - } - - /** - * Disposing of the view should remove all the listeners on the - * turnOnMicSignal. - */ - [Test] - public function dispose_RemovesListenersToTurnOnMicSignal(): void - { - var micButton: MicButton = createView(); - micButton.turnOnMicSignal.add(dummyMethod); - micButton.dispose(); - - assertThat(micButton.turnOnMicSignal.numListeners, equalTo(0)); - } - - /** - * Creates the test subject. - */ - private function createView(): MicButton - { - var micButton: MicButton = new MicButton(); - UIImpersonator.addElement(micButton); - return micButton; - } - } -} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/NavigationButtonConfigTest.as b/tests/org/bigbluebutton/view/ui/NavigationButtonConfigTest.as new file mode 100644 index 0000000..52e241d --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/NavigationButtonConfigTest.as @@ -0,0 +1,137 @@ +package org.bigbluebutton.view.ui +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.command.NavigateToSignal; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.commandCenter.dsl.ICommandMapper; + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class NavigationButtonConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + [Mock] + public var commandMapper:ICommandMapper; + + private static var TIMEOUT:Number = 5000; + + protected var instance:NavigationButtonConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper, ICommandMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new NavigationButtonConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfNavigationButtonConfig():void + { + assertTrue("instance is NavigationButtonConfig", instance is NavigationButtonConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(INavigationButton).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(NavigateToSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(INavigationButton).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(NavigateToSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + [Test] + public function executed_callsSignalCommandMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(INavigationButton).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(NavigateToSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.signalCommandMap, received().method('map')); + } + + [Test] + public function executed_callsCommandMapperToCommandMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(INavigationButton).returns(mediatorMapper); + stub(instance.signalCommandMap).method("map").args(NavigateToSignal).returns(commandMapper); + + // Act + instance.configure(); + + // Assert + assertThat(commandMapper, received().method('toCommand')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/NavigationButtonMediatorTest.as b/tests/org/bigbluebutton/view/ui/NavigationButtonMediatorTest.as new file mode 100644 index 0000000..ca703fd --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/NavigationButtonMediatorTest.as @@ -0,0 +1,86 @@ +package org.bigbluebutton.view.ui +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.model.UserList; + import org.bigbluebutton.model.UserUISession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class NavigationButtonMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:NavigationButton; + + [Mock] + public var userSession:UserUISession; + + [Mock] + public var pageChangedSignal:Signal; + + [Mock] + public var navigationSignal:Signal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:NavigationButtonMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(NavigationButton, UserUISession, UserList, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new NavigationButtonMediator(); + + instance.view = this.view; + instance.userSession = this.userSession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfNavigationButtonMediator():void + { + assertTrue("instance is NavigationButtonMediator", instance is NavigationButtonMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userSession).getter("pageChangedSignal").returns(this.pageChangedSignal); + stub(instance.view).getter("navigationSignal").returns(this.navigationSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/ui/NavigationButtonTest.as b/tests/org/bigbluebutton/view/ui/NavigationButtonTest.as new file mode 100644 index 0000000..29be48d --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/NavigationButtonTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.ui +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Button; + + public class NavigationButtonTest + { + protected var instance:NavigationButton; + + [Before] + public function setUp():void + { + instance = new NavigationButton(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfNavigationButton():void + { + assertTrue("instance is NavigationButton", instance is NavigationButton); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Button component", instance is Button); + } + + [Test] + public function instantiated_implementsINavigationButton():void + { + assertTrue("instance implements INavigationButton", instance is INavigationButton); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/SwapCameraButtonTest.as b/tests/org/bigbluebutton/view/ui/SwapCameraButtonTest.as new file mode 100644 index 0000000..450401e --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/SwapCameraButtonTest.as @@ -0,0 +1,47 @@ +package org.bigbluebutton.view.ui +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Button; + + public class SwapCameraButtonTest + { + protected var instance:SwapCameraButton; + + [Before] + public function setUp():void + { + instance = new SwapCameraButton(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSwapCameraButton():void + { + assertTrue("instance is SwapCameraButton", instance is SwapCameraButton); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Button component", instance is Button); + } + + [Test] + public function instantiated_implementsISwapCameraButton():void + { + assertTrue("instance implements ISwapCameraButton", instance is ISwapCameraButton); + } + + [Test] + public function instantiated_visibleByDefault():void + { + assertTrue("SwapCamera button is visible by default", instance.visible); + } + } +} diff --git a/tests/org/bigbluebutton/view/ui/SwapCameraConfigTest.as b/tests/org/bigbluebutton/view/ui/SwapCameraConfigTest.as new file mode 100644 index 0000000..3d6a421 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/SwapCameraConfigTest.as @@ -0,0 +1,107 @@ +package org.bigbluebutton.view.ui +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.command.NavigateToSignal; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.commandCenter.dsl.ICommandMapper; + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class SwapCameraConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + [Mock] + public var commandMapper:ICommandMapper; + + private static var TIMEOUT:Number = 5000; + + protected var instance:SwapCameraConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper, ICommandMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new SwapCameraConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSwapCameraConfig():void + { + assertTrue("instance is SwapCameraConfig", instance is SwapCameraConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(ISwapCameraButton).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(ISwapCameraButton).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/SwapCameraMediatorTest.as b/tests/org/bigbluebutton/view/ui/SwapCameraMediatorTest.as new file mode 100644 index 0000000..34f3443 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/SwapCameraMediatorTest.as @@ -0,0 +1,68 @@ +package org.bigbluebutton.view.ui +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class SwapCameraMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:SwapCameraButton; + + private static var TIMEOUT:Number = 5000; + + protected var instance:SwapCameraMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(SwapCameraButton), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new SwapCameraMediator(); + + instance.view = this.view; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfSwapCameraMediator():void + { + assertTrue("instance is SwapCameraMediator", instance is SwapCameraMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/VideoTest.as b/tests/org/bigbluebutton/view/ui/VideoTest.as new file mode 100644 index 0000000..81ae79b --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/VideoTest.as @@ -0,0 +1,39 @@ +package org.bigbluebutton.view.ui +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class VideoTest + { + protected var instance:Video; + + [Before] + public function setUp():void + { + instance = new Video(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + // TODO : addChild in the Video constructor throws the exception, need to investigate + + [Ignore] + [Test] + public function instantiated_isInstanceOfVideo():void + { + assertTrue("instance is Video", instance is Video); + } + + [Ignore] + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/loading/ILoadingScreenTest.as b/tests/org/bigbluebutton/view/ui/loading/ILoadingScreenTest.as new file mode 100644 index 0000000..62d6f43 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/loading/ILoadingScreenTest.as @@ -0,0 +1,27 @@ +package org.bigbluebutton.view.ui.loading +{ + import org.flexunit.asserts.assertTrue; + + public class ILoadingScreenTest + { + protected var instance:ILoadingScreen; + + [Before] + public function setUp():void + { + instance = new LoadingScreen(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoadingScreen():void + { + assertTrue("instance is LoadingScreen", instance is LoadingScreen); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/loading/LoadingScreenBaseTest.as b/tests/org/bigbluebutton/view/ui/loading/LoadingScreenBaseTest.as new file mode 100644 index 0000000..ebe1ec2 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/loading/LoadingScreenBaseTest.as @@ -0,0 +1,35 @@ +package org.bigbluebutton.view.ui.loading +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class LoadingScreenBaseTest + { + protected var instance:LoadingScreenBase; + + [Before] + public function setUp():void + { + instance = new LoadingScreenBase(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoadingScreenBase():void + { + assertTrue("instance is LoadingScreenBase", instance is LoadingScreenBase); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + } +} diff --git a/tests/org/bigbluebutton/view/ui/loading/LoadingScreenConfigTest.as b/tests/org/bigbluebutton/view/ui/loading/LoadingScreenConfigTest.as new file mode 100644 index 0000000..b45bcc6 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/loading/LoadingScreenConfigTest.as @@ -0,0 +1,102 @@ +package org.bigbluebutton.view.ui.loading +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; + import robotlegs.bender.extensions.mediatorMap.dsl.IMediatorMapper; + import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; + import robotlegs.bender.framework.api.IConfig; + import robotlegs.bender.framework.api.IInjector; + + public class LoadingScreenConfigTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var injector:IInjector; + + [Mock] + public var mediatorMap:IMediatorMap; + + [Mock] + public var mediatorMapper:IMediatorMapper; + + [Mock] + public var signalCommandMap:ISignalCommandMap; + + private static var TIMEOUT:Number = 5000; + + protected var instance:LoadingScreenConfig; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(IInjector, IMediatorMap, ISignalCommandMap, IMediatorMapper), Event.COMPLETE, TIMEOUT, timeoutHandler); + instance = new LoadingScreenConfig(); + + instance.injector = this.injector; + instance.mediatorMap = this.mediatorMap; + instance.signalCommandMap = this.signalCommandMap; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoadingScreenConfig():void + { + assertTrue("instance is LoadingScreenConfig", instance is LoadingScreenConfig); + } + + [Test] + public function instantiated_implementsIConfigInterface():void + { + assertTrue("instance implements IConfig interface", instance is IConfig); + } + + [Test] + public function executed_callsMediatorMapMapMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(ILoadingScreen).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(instance.mediatorMap, received().method('map')); + } + + [Test] + public function executed_callsMediatorMapperToMediatorMethod():void + { + // Arrange + stub(instance.mediatorMap).method("map").args(ILoadingScreen).returns(mediatorMapper); + + // Act + instance.configure(); + + // Assert + assertThat(mediatorMapper, received().method('toMediator')); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} diff --git a/tests/org/bigbluebutton/view/ui/loading/LoadingScreenMediatorTest.as b/tests/org/bigbluebutton/view/ui/loading/LoadingScreenMediatorTest.as new file mode 100644 index 0000000..6d90327 --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/loading/LoadingScreenMediatorTest.as @@ -0,0 +1,81 @@ +package org.bigbluebutton.view.ui.loading +{ + import flash.events.Event; + + import mockolate.prepare; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.model.UserUISession; + import org.flexunit.asserts.assertTrue; + import org.flexunit.asserts.fail; + import org.flexunit.async.Async; + import org.osflash.signals.Signal; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class LoadingScreenMediatorTest + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var view:LoadingScreen; + + [Mock] + public var userUISession:UserUISession; + + [Mock] + public var loadingSignal:Signal; + + private static var TIMEOUT:Number = 5000; + + protected var instance:LoadingScreenMediator; + + [Before(async)] + public function setUp():void + { + Async.proceedOnEvent(this, prepare(LoadingScreen, UserUISession, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) + instance = new LoadingScreenMediator(); + + instance.view = this.view; + instance.userUISettings = this.userUISession; + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoadingScreenMediator():void + { + assertTrue("instance is LoadingScreenMediator", instance is LoadingScreenMediator); + } + + [Test] + public function instantiated_isRobotlegsMediator():void + { + assertTrue("instance is Robotlegs Mediator", instance is Mediator); + } + + [Test] + public function destroyed_viewIsDestroyed():void + { + // Arrange + stub(instance.userUISettings).getter("loadingSignal").returns(this.loadingSignal); + + // Act + instance.destroy(); + + // Assert + assertTrue("view is destroyed when mediator is destroyed", instance.view == null); + } + + protected function timeoutHandler(passThroughData:Object):void + { + fail("Timeout occured during setUp() method"); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/loading/LoadingScreenTest.as b/tests/org/bigbluebutton/view/ui/loading/LoadingScreenTest.as new file mode 100644 index 0000000..9a5a1bc --- /dev/null +++ b/tests/org/bigbluebutton/view/ui/loading/LoadingScreenTest.as @@ -0,0 +1,41 @@ +package org.bigbluebutton.view.ui.loading +{ + import org.flexunit.asserts.assertTrue; + + import spark.components.Group; + + public class LoadingScreenTest + { + protected var instance:LoadingScreen; + + [Before] + public function setUp():void + { + instance = new LoadingScreen(); + } + + [After] + public function tearDown():void + { + instance = null; + } + + [Test] + public function instantiated_isInstanceOfLoadingScreen():void + { + assertTrue("instance is LoadingScreen", instance is LoadingScreen); + } + + [Test] + public function instantiated_isSparkComponent():void + { + assertTrue("instance is Spark Group component", instance is Group); + } + + [Test] + public function instantiated_implementsILoadingScreen():void + { + assertTrue("instance implements ILoadingScreen", instance is ILoadingScreen); + } + } +} \ No newline at end of file From bb3a6b96a59cb5ce8c8d5f646f0f9346abfee424 Mon Sep 17 00:00:00 2001 From: syeshchenko Date: Fri, 27 Jun 2014 12:18:55 -0400 Subject: [PATCH 02/10] removing BackButtonTest file because original file was deleted --- .../bigbluebutton/view/ui/BackButtonTest.as | 42 ------------------- 1 file changed, 42 deletions(-) delete mode 100644 tests/org/bigbluebutton/view/ui/BackButtonTest.as diff --git a/tests/org/bigbluebutton/view/ui/BackButtonTest.as b/tests/org/bigbluebutton/view/ui/BackButtonTest.as deleted file mode 100644 index d73a204..0000000 --- a/tests/org/bigbluebutton/view/ui/BackButtonTest.as +++ /dev/null @@ -1,42 +0,0 @@ -package org.bigbluebutton.view.ui -{ - import org.flexunit.asserts.assertFalse; - import org.flexunit.asserts.assertTrue; - - import spark.components.Button; - - public class MicButtonTest - { - protected var instance:MicButton; - - [Before] - public function setUp():void - { - instance = new MicButton(); - } - - [After] - public function tearDown():void - { - instance = null; - } - - [Test] - public function instantiated_isInstanceOfMicButton():void - { - assertTrue("instance is MicButton", instance is MicButton); - } - - [Test] - public function instantiated_isSparkComponent():void - { - assertTrue("instance is Spark Button component", instance is Button); - } - - [Test] - public function instantiated_implementsIMicButton():void - { - assertTrue("instance implements IMicButton", instance is IMicButton); - } - } -} \ No newline at end of file From fce9af04313c2d6a20867867ef89fcb24ff38102 Mon Sep 17 00:00:00 2001 From: syeshchenko Date: Wed, 2 Jul 2014 10:59:44 -0400 Subject: [PATCH 03/10] removing extra xml conf file, adding destroy method to SwapCameraMediator and corresponding test --- src/BBBUnitTests-app.xml | 268 ------------------ .../view/ui/SwapCameraMediator.as | 8 + .../view/ui/SwapCameraMediatorTest.as | 21 +- 3 files changed, 27 insertions(+), 270 deletions(-) delete mode 100644 src/BBBUnitTests-app.xml diff --git a/src/BBBUnitTests-app.xml b/src/BBBUnitTests-app.xml deleted file mode 100644 index b3f2e38..0000000 --- a/src/BBBUnitTests-app.xml +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - BBBUnitTests - - - BBBUnitTests - - - BBBUnitTests - - - 0.0.0 - - - - - - - - - - - - - - - - - - [This value will be overwritten by Flash Builder in the output app.xml] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - false - false - none - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 16bit - - - - - - - - - - - - - - - - - - ]]> - - - UIDeviceFamily - - 1 - 2 - - ]]> - high - - diff --git a/src/org/bigbluebutton/view/ui/SwapCameraMediator.as b/src/org/bigbluebutton/view/ui/SwapCameraMediator.as index 9fc3189..11617be 100644 --- a/src/org/bigbluebutton/view/ui/SwapCameraMediator.as +++ b/src/org/bigbluebutton/view/ui/SwapCameraMediator.as @@ -63,5 +63,13 @@ package org.bigbluebutton.view.ui view.setVisibility(user.hasStream); } } + + public override function destroy():void + { + (view as SwapCameraButton).removeEventListener(MouseEvent.CLICK, mouseClickHandler); + userSession.userList.userChangeSignal.remove(userChangeHandler); + view.dispose(); + view = null; + } } } \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/ui/SwapCameraMediatorTest.as b/tests/org/bigbluebutton/view/ui/SwapCameraMediatorTest.as index 34f3443..369456c 100644 --- a/tests/org/bigbluebutton/view/ui/SwapCameraMediatorTest.as +++ b/tests/org/bigbluebutton/view/ui/SwapCameraMediatorTest.as @@ -4,10 +4,14 @@ package org.bigbluebutton.view.ui import mockolate.prepare; import mockolate.runner.MockolateRule; + import mockolate.stub; + import org.bigbluebutton.model.UserList; + import org.bigbluebutton.model.UserSession; import org.flexunit.asserts.assertTrue; import org.flexunit.asserts.fail; import org.flexunit.async.Async; + import org.osflash.signals.Signal; import robotlegs.bender.bundles.mvcs.Mediator; @@ -19,6 +23,15 @@ package org.bigbluebutton.view.ui [Mock] public var view:SwapCameraButton; + [Mock] + public var userList:UserList; + + [Mock] + public var userSession:UserSession; + + [Mock] + public var userChangeSignal:Signal; + private static var TIMEOUT:Number = 5000; protected var instance:SwapCameraMediator; @@ -26,10 +39,11 @@ package org.bigbluebutton.view.ui [Before(async)] public function setUp():void { - Async.proceedOnEvent(this, prepare(SwapCameraButton), Event.COMPLETE, TIMEOUT, timeoutHandler) + Async.proceedOnEvent(this, prepare(SwapCameraButton, UserSession, UserList, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) instance = new SwapCameraMediator(); instance.view = this.view; + instance.userSession = this.userSession; } [After] @@ -52,7 +66,10 @@ package org.bigbluebutton.view.ui [Test] public function destroyed_viewIsDestroyed():void - { + { + stub(instance.userSession).getter("userList").returns(this.userList); + stub(instance.userSession.userList).getter("userChangeSignal").returns(this.userChangeSignal); + // Act instance.destroy(); From b1e72b656b5a63041ae28c4bf40a908f9e5850e1 Mon Sep 17 00:00:00 2001 From: Adam Sharpe Date: Mon, 15 Sep 2014 14:20:47 -0400 Subject: [PATCH 04/10] MicrophoneMuteCommand unit tests --- src/FlexUnitApplication.mxml | 334 +----------------- .../command/MicrophoneMuteCommand.as | 2 +- .../command/MicrophoneMuteCommandTest.as | 62 +++- 3 files changed, 62 insertions(+), 336 deletions(-) diff --git a/src/FlexUnitApplication.mxml b/src/FlexUnitApplication.mxml index 67ee55d..4fde7c3 100644 --- a/src/FlexUnitApplication.mxml +++ b/src/FlexUnitApplication.mxml @@ -11,171 +11,6 @@ Date: Mon, 15 Sep 2014 15:08:06 -0400 Subject: [PATCH 05/10] Cleaning up CameraQualityCommandTest (I think...) --- .../command/CameraQualityCommandTest.as | 30 +++++-------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/tests/org/bigbluebutton/command/CameraQualityCommandTest.as b/tests/org/bigbluebutton/command/CameraQualityCommandTest.as index 402170f..dbc726d 100644 --- a/tests/org/bigbluebutton/command/CameraQualityCommandTest.as +++ b/tests/org/bigbluebutton/command/CameraQualityCommandTest.as @@ -2,6 +2,7 @@ package org.bigbluebutton.command { import flash.events.Event; + import mockolate.nice; import mockolate.prepare; import mockolate.received; import mockolate.runner.MockolateRule; @@ -21,20 +22,15 @@ package org.bigbluebutton.command [Rule] public var mockolateRule:MockolateRule = new MockolateRule(); - [Mock] - public var videoConnection:VideoConnection; - [Mock] public var userSession:UserSession; - private static var TIMEOUT:Number = 5000; - protected var instance:CameraQualityCommand; [Before(async)] public function setUp():void { - Async.proceedOnEvent(this, prepare(VideoConnection), Event.COMPLETE, TIMEOUT, timeoutHandler); + Async.proceedOnEvent(this, prepare(VideoConnection), Event.COMPLETE); instance = new CameraQualityCommand(); instance.userSession = userSession; } @@ -60,34 +56,22 @@ package org.bigbluebutton.command [Test] public function executed_callsSelectCameraQualityMethod():void { - // arrange - stub(instance.userSession).getter("videoConnection").returns(videoConnection); - - // act + var videoConnection:VideoConnection = nice(VideoConnection); + stub(userSession).getter("videoConnection").returns(videoConnection); instance.execute(); - - // assert assertThat(instance.userSession.videoConnection, received().method('selectCameraQuality')); } [Test] public function executed_callsSelectCameraQualityMethodWithCorrectArgs():void { - // arrange + var videoConnection:VideoConnection = nice(VideoConnection); instance.cameraQualitySelected = 2; instance.userSession = userSession; - stub(instance.userSession).getter("videoConnection").returns(videoConnection); - - // act + stub(userSession).getter("videoConnection").returns(videoConnection); instance.execute(); - - // assert assertThat(instance.userSession.videoConnection, received().method('selectCameraQuality').arg(2)); } - - protected function timeoutHandler(passThroughData:Object):void - { - fail("Timeout occured during setUp() method"); - } + } } \ No newline at end of file From 5d0c2834bc636bf21fb2c99e1845575a1707b0c6 Mon Sep 17 00:00:00 2001 From: Adam Sharpe Date: Mon, 15 Sep 2014 18:06:52 -0400 Subject: [PATCH 06/10] Started ShareCameraCommand unit tests, fixed a booboo with the mic mute test... --- .../command/MicrophoneMuteCommandTest.as | 4 +- .../command/ShareCameraCommandTest.as | 83 ++++++++++++++++++- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/tests/org/bigbluebutton/command/MicrophoneMuteCommandTest.as b/tests/org/bigbluebutton/command/MicrophoneMuteCommandTest.as index 615f024..849d55c 100644 --- a/tests/org/bigbluebutton/command/MicrophoneMuteCommandTest.as +++ b/tests/org/bigbluebutton/command/MicrophoneMuteCommandTest.as @@ -78,7 +78,7 @@ package org.bigbluebutton.command stub(user).getter("muted").returns(true); mock(userService).method("unmute").args(user); instance.execute(); - assertThat(userService, received().method("unmute")); + assertThat(instance.userService, received().method("unmute")); } [Test] @@ -87,7 +87,7 @@ package org.bigbluebutton.command stub(user).getter("muted").returns(false); mock(userService).method("mute").args(user); instance.execute(); - assertThat(userService, received().method("mute")); + assertThat(instance.userService, received().method("mute")); } } } diff --git a/tests/org/bigbluebutton/command/ShareCameraCommandTest.as b/tests/org/bigbluebutton/command/ShareCameraCommandTest.as index 921b089..bc5d25b 100644 --- a/tests/org/bigbluebutton/command/ShareCameraCommandTest.as +++ b/tests/org/bigbluebutton/command/ShareCameraCommandTest.as @@ -1,17 +1,44 @@ package org.bigbluebutton.command { + import flash.events.Event; + + import mockolate.mock; + import mockolate.nice; + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.stub; + + import org.bigbluebutton.core.IUsersService; + import org.bigbluebutton.core.VideoConnection; + import org.bigbluebutton.model.IUserSession; import org.flexunit.asserts.assertTrue; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.hamcrest.object.equalTo; import robotlegs.bender.bundles.mvcs.Command; public class ShareCameraCommandTest - { + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var mockUserSession:IUserSession; + + [Mock] + public var mockUserService:IUsersService; + protected var instance:ShareCameraCommand; - [Before] + [Before (async)] public function setUp():void { instance = new ShareCameraCommand(); + instance.userSession = mockUserSession; + instance.usersService = mockUserService; + Async.proceedOnEvent(this, prepare(VideoConnection), Event.COMPLETE); } [After] @@ -20,6 +47,58 @@ package org.bigbluebutton.command instance = null; } + [Test] + public function execute_enabledIsFalse_removeStreamInvokedOnUserService():void + { + instance.enabled = false; + var mockVideoConnection:VideoConnection = nice(VideoConnection); + mock(mockUserSession).getter("videoConnection").returns(mockVideoConnection); + instance.execute(); + assertThat(instance.usersService, received().method("removeStream")); + } + + [Test] + public function execute_enabledIsFalse_stopPublishingInvokedOnVideoConnection():void + { + instance.enabled = false; + var mockVideoConnection:VideoConnection = nice(VideoConnection); + stub(mockUserSession).getter("videoConnection").returns(mockVideoConnection); + instance.execute(); + assertThat(instance.userSession.videoConnection, received().method("stopPublishing")); + } + + [Test] + public function execute_enabledIsTrue_cameraPositionIsSetForVideoConnection():void + { + instance.enabled = true; + instance.position = "some camera position"; + var mockVideoConnection:VideoConnection = nice(VideoConnection); + stub(mockUserSession).getter("videoConnection").returns(mockVideoConnection); + mock(mockVideoConnection).setter("cameraPosition").arg("some camera position").atLeast(1); + instance.execute(); + } + + /* Mockolate does not allow the mocking and stubbing of static methods. Camera objects are got via + * the 'Camera.getCamera()' method, which is static. Therefore, I am not sure how to properly have + * this return null/'my-fake-camera' for the following three tests... - Adam */ + [Test] + public function execute_cameraIsNull_startPublishingIsNotInvoked():void + { + + } + + [Test] + public function execute_enabledIsTrue_addStreamInvokedOnUserService():void + { + + } + + [Test] + public function execute_enabledIsTrue_startPublishingInvokedOnVideoConnection():void + { + + } + [Test] public function instantiated_isInstanceOfShareCameraCommand():void { From 0799f892b893f415ba01801fcb5331c95a3d501d Mon Sep 17 00:00:00 2001 From: Adam Sharpe Date: Mon, 20 Oct 2014 16:44:24 -0400 Subject: [PATCH 07/10] Unit testing for the UserList and some commands (though they still need quite a bit of work). Changed a couple of log statements to use trace instead. --- .../bigbluebutton/command/ConnectCommand.as | 8 +- .../command/ShareMicrophoneCommand.as | 4 +- src/org/bigbluebutton/model/UserList.as | 4 +- .../command/ConnectCommandTest.as | 235 +++++- .../command/ShareCameraCommandTest.as | 2 +- .../command/ShareMicrophoneCommandTest.as | 100 ++- tests/org/bigbluebutton/model/UserListTest.as | 796 +++++++++++++++++- .../model/UserListTestHelperEvents.as | 28 + 8 files changed, 1152 insertions(+), 25 deletions(-) create mode 100644 tests/org/bigbluebutton/model/UserListTestHelperEvents.as diff --git a/src/org/bigbluebutton/command/ConnectCommand.as b/src/org/bigbluebutton/command/ConnectCommand.as index a446b32..dd35cbe 100644 --- a/src/org/bigbluebutton/command/ConnectCommand.as +++ b/src/org/bigbluebutton/command/ConnectCommand.as @@ -65,7 +65,7 @@ package org.bigbluebutton.command } private function successConnected():void { - Log.getLogger("org.bigbluebutton").info(String(this) + ":successConnected()"); + trace("ConnectCommand::successConnected -- Success connecting to server"); userSession.mainConnection = connection; userSession.userId = connection.userId; @@ -140,7 +140,7 @@ package org.bigbluebutton.command } private function unsuccessConnected(reason:String):void { - Log.getLogger("org.bigbluebutton").info(String(this) + ":unsuccessConnected()"); + trace("ConnectCommand::unsuccessConnected() -- Failed to connect to the server!!!"); userUISession.loading = false; userUISession.unsuccessJoined.dispatch("connectionFailed"); @@ -150,14 +150,14 @@ package org.bigbluebutton.command } private function successVideoConnected():void { - Log.getLogger("org.bigbluebutton").info(String(this) + ":successVideoConnected()"); + trace("ConnectionConnamd::successVideoConnected() -- Connected to the video server"); videoConnection.successConnected.remove(successVideoConnected); videoConnection.unsuccessConnected.remove(unsuccessVideoConnected); } private function unsuccessVideoConnected(reason:String):void { - Log.getLogger("org.bigbluebutton").info(String(this) + ":unsuccessVideoConnected()"); + trace("ConnectionConnamd::unsuccessVideoConnected() -- Failed to connect to the video server"); videoConnection.unsuccessConnected.remove(unsuccessVideoConnected); videoConnection.successConnected.remove(successVideoConnected); diff --git a/src/org/bigbluebutton/command/ShareMicrophoneCommand.as b/src/org/bigbluebutton/command/ShareMicrophoneCommand.as index 54d3168..552d584 100644 --- a/src/org/bigbluebutton/command/ShareMicrophoneCommand.as +++ b/src/org/bigbluebutton/command/ShareMicrophoneCommand.as @@ -43,9 +43,9 @@ package org.bigbluebutton.command voiceConnection = userSession.voiceConnection; if (!voiceConnection.connection.connected) { - voiceConnection.connect(conferenceParameters); voiceConnection.successConnected.add(mediaSuccessConnected); voiceConnection.unsuccessConnected.add(mediaUnsuccessConnected); + voiceConnection.connect(conferenceParameters); } else if (!voiceConnection.callActive) { voiceConnection.call(); @@ -63,7 +63,7 @@ package org.bigbluebutton.command } private function mediaSuccessConnected(publishName:String, playName:String, codec:String):void { - Log.getLogger("org.bigbluebutton").info(String(this) + ":mediaSuccessConnected()"); + // Log.getLogger("org.bigbluebutton").info(String(this) + ":mediaSuccessConnected()"); var manager:VoiceStreamManager = new VoiceStreamManager(); manager.play(voiceConnection.connection, playName); diff --git a/src/org/bigbluebutton/model/UserList.as b/src/org/bigbluebutton/model/UserList.as index 98dce8d..8f345b2 100644 --- a/src/org/bigbluebutton/model/UserList.as +++ b/src/org/bigbluebutton/model/UserList.as @@ -256,9 +256,9 @@ package org.bigbluebutton.model return null; } - public function removePresenter(userID:String):void { + public function removePresenter():void { var u:User = getPresenter(); - if (u.presenter) { + if (u != null && u.presenter) { u.presenter = false; userChangeSignal.dispatch(u, PRESENTER); diff --git a/tests/org/bigbluebutton/command/ConnectCommandTest.as b/tests/org/bigbluebutton/command/ConnectCommandTest.as index 4d2eedd..482b3e8 100644 --- a/tests/org/bigbluebutton/command/ConnectCommandTest.as +++ b/tests/org/bigbluebutton/command/ConnectCommandTest.as @@ -1,35 +1,254 @@ package org.bigbluebutton.command { + import flash.events.Event; + + import mockolate.arg; + import mockolate.expect; + import mockolate.expectArg; + import mockolate.mock; + import mockolate.nice; + import mockolate.prepare; + import mockolate.received; + import mockolate.runner.MockolateRule; + import mockolate.strict; + import mockolate.stub; + + import org.bigbluebutton.core.IBigBlueButtonConnection; + import org.bigbluebutton.core.IChatMessageService; + import org.bigbluebutton.core.IDeskshareConnection; + import org.bigbluebutton.core.IPresentationService; + import org.bigbluebutton.core.IUsersService; + import org.bigbluebutton.core.IVideoConnection; + import org.bigbluebutton.core.IVoiceConnection; + import org.bigbluebutton.model.Config; + import org.bigbluebutton.model.IConferenceParameters; + import org.bigbluebutton.model.IUserSession; + import org.bigbluebutton.model.IUserUISession; + import org.bigbluebutton.model.UserList; + import org.bigbluebutton.view.navigation.pages.PagesENUM; import org.flexunit.asserts.assertTrue; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.hamcrest.core.anything; + import org.hamcrest.object.equalTo; + import org.hamcrest.object.instanceOf; + import org.osflash.signals.Signal; import robotlegs.bender.bundles.mvcs.Command; public class ConnectCommandTest { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var mockConnection:IBigBlueButtonConnection; + + [Mock] + public var mockConferenceParameters:IConferenceParameters; + + [Mock] + public var mockUserSession:IUserSession; + + [Mock] + public var mockUsersService:IUsersService; + + [Mock] + public var mockUserUISession:IUserUISession; + + [Mock] + public var mockUserList:UserList; + + [Mock] + public var mockChatService:IChatMessageService; + + [Mock] + public var mockPresentationService:IPresentationService; + + [Mock] + public var mockVideoConnection:IVideoConnection; + + [Mock] + public var mockVoiceConnection:IVoiceConnection; + + [Mock] + public var mockDeskshareConnection:IDeskshareConnection; + + [Mock] + public var fakeUIUnsuccessConnectedSignal:Signal; + + [Mock] + public var mockConfig:Config; + + /* Returned by the mockConfig 'getConfigFor', to imitate the real config XML */ + public var fakeXML:XML = + ; + + /* The fake signals that need to be dispatched. There may be a better way to 'fake' signals, + * but I don't know how to mock them with Mockolate (I need them to dispatch real signals). */ + public var mockSuccessConnected:Signal = new Signal(); + public var mockUnsuccessConnected:Signal = new Signal(); + + public var mockSuccessJoiningMeetingSignal:Signal = new Signal(); + public var mockUnsuccessJoiningMeetingSignal:Signal = new Signal; + + public var mockVideoConnectionSuccessConnected:Signal = new Signal(); + public var mockVideoConnectionUnsuccessConnected:Signal = new Signal(); + + public var mockUserListAllUsersAddedSignal:Signal = new Signal(); + protected var instance:ConnectCommand; [Before] public function setUp():void { instance = new ConnectCommand(); + + instance.connection = mockConnection; + instance.userSession = mockUserSession; + instance.userUISession = mockUserUISession; + instance.conferenceParameters = mockConferenceParameters; + instance.usersService = mockUsersService; + instance.chatService = mockChatService; + instance.presentationService = mockPresentationService; + instance.videoConnection = mockVideoConnection; + instance.voiceConnection = mockVoiceConnection; + instance.deskshareConnection = mockDeskshareConnection; + + stub(mockUserSession).getter("successJoiningMeetingSignal").returns(mockSuccessJoiningMeetingSignal); + stub(mockUserSession).getter("unsuccessJoiningMeetingSignal").returns(mockUnsuccessJoiningMeetingSignal); + stub(mockUserSession).getter("config").returns(mockConfig); + stub(mockUserSession).getter("userList").returns(mockUserList); + + stub(mockUserList).getter("allUsersAddedSignal").returns(mockUserListAllUsersAddedSignal); + + stub(mockConnection).getter("successConnected").returns(mockSuccessConnected); + stub(mockConnection).getter("unsuccessConnected").returns(mockUnsuccessConnected); + + stub(mockVideoConnection).getter("successConnected").returns(mockVideoConnectionSuccessConnected); + stub(mockVideoConnection).getter("unsuccessConnected").returns(mockVideoConnectionUnsuccessConnected); + + stub(mockConferenceParameters).getter("room").returns("ROOM"); + + stub(mockConfig).method("getConfigFor").args("VideoConfModule").returns(new XML(fakeXML.video.toXMLString())); + stub(mockConfig).method("getConfigFor").args("PhoneModule").returns(new XML(fakeXML.voice.toXMLString())); + stub(mockConfig).method("getConfigFor").args("DeskShareModule").returns(new XML(fakeXML.deskshare.toXMLString())); } - [After] - public function tearDown():void + [Test] + public function execute_connect_connectInvokedOnConnectionWithConference():void { - instance = null; - } + expect(mockConnection.connect(mockConferenceParameters)); + instance.execute(); + } + + [Test] + public function execute_successConnected_userSessionAndServiceInitialized():void + { + stub(mockConnection).method("connect").args(mockConferenceParameters).calls(mockSuccessConnected.dispatch); + expect(mockUserSession.mainConnection = mockConnection); + expect(mockUserSession.userId = mockConnection.userId); + expect(mockUsersService.setupMessageSenderReceiver()); + expect(mockUsersService.sendJoinMeetingMessage()); + instance.execute(); + } + + [Test] + public function execute_successConnected_connectedSignalsRemoved():void + { + stub(mockConnection).method("connect").args(mockConferenceParameters).calls(mockSuccessConnected.dispatch); + expect(mockSuccessConnected.remove); + expect(mockUnsuccessConnected.remove); + instance.execute(); + } + + [Test] + public function execute_successJoined_MessageSendersAndReceiversSetup():void + { + stub(mockConnection).method("connect").args(mockConferenceParameters).calls(mockSuccessConnected.dispatch); + stub(mockUsersService).method("sendJoinMeetingMessage").calls(mockSuccessJoiningMeetingSignal.dispatch); + expect(mockChatService.setupMessageSenderReceiver); + expect(mockPresentationService.setupMessageSenderReceiver); + instance.execute(); + } + + [Test] + public function execute_successJoined_connectionURIsSet():void + { + stub(mockConnection).method("connect").args(mockConferenceParameters).calls(mockSuccessConnected.dispatch); + stub(mockUsersService).method("sendJoinMeetingMessage").calls(mockSuccessJoiningMeetingSignal.dispatch); + + expect(mockVideoConnection.uri = arg("VIDEO_MODULE_URI" + "/" + "ROOM")); + expect(mockVoiceConnection.uri = arg("PHONE_MODULE_URI")); + expect(mockDeskshareConnection.applicationURI = arg("DESKSHARE_MODULE_URI")); + expect(mockDeskshareConnection.room = arg("ROOM")); + + instance.execute(); + } + /* This only 'sometimes' works... there is stuff I'm still not understanding about Mockolate (and resources are sparce...). */ + [Test] + public function execute_successJoined_connectInvokedOnVideoAndDeskshareConnection():void + { + stub(mockConnection).method("connect").args(mockConferenceParameters).calls(mockSuccessConnected.dispatch); + stub(mockUsersService).method("sendJoinMeetingMessage").calls(mockSuccessJoiningMeetingSignal.dispatch); + expect(mockVideoConnection.connect).once(); + expect(mockDeskshareConnection.connect).once(); + instance.execute(); + } + [Test] - public function instantiated_isInstanceOfConnectCommand():void + public function execute_successJoined_connectionsAssignedToUserSession():void { - assertTrue("instance is ConnectCommand", instance is ConnectCommand); + stub(mockConnection).method("connect").args(mockConferenceParameters).calls(mockSuccessConnected.dispatch); + stub(mockUsersService).method("sendJoinMeetingMessage").calls(mockSuccessJoiningMeetingSignal.dispatch); + expect(mockUserSession.videoConnection = arg(mockVideoConnection)); + expect(mockUserSession.voiceConnection = arg(mockVoiceConnection)); + expect(mockUserSession.deskshareConnection = arg(mockDeskshareConnection)); + instance.execute(); } [Test] - public function instantiated_implementsRobotlegsCommand():void + public function execute_successJoined_queryServerForUserChatPresentationInfo():void { - assertTrue("instance is robotlegs Command", instance is Command); + stub(mockConnection).method("connect").args(mockConferenceParameters).calls(mockSuccessConnected.dispatch); + stub(mockUsersService).method("sendJoinMeetingMessage").calls(mockSuccessJoiningMeetingSignal.dispatch); + expect(mockChatService.getPublicChatMessages); + expect(mockPresentationService.getPresentationInfo); + expect(mockUsersService.queryForParticipants); + expect(mockUsersService.queryForRecordingStatus); + instance.execute(); } + + [Test] + public function execute_allUsersSuccessfullyAdded_userUISessionStarted():void + { + stub(mockConnection).method("connect").args(mockConferenceParameters).calls(mockSuccessConnected.dispatch); + stub(mockUsersService).method("sendJoinMeetingMessage").calls(mockSuccessJoiningMeetingSignal.dispatch); + stub(mockUsersService).method("queryForParticipants").calls(mockUserListAllUsersAddedSignal.dispatch); + expect(mockUserUISession.loading = arg(false)); + expect(mockUserUISession.pushPage(PagesENUM.PARTICIPANTS)); + instance.execute(); + } + + [Test] + public function execute_unsuccessConnecting_userUISessionUnsuccessDispatched():void + { + stub(mockConnection).method("connect").args(mockConferenceParameters).calls(mockUnsuccessConnected.dispatch, ["REASON"]); + expect(mockUserUISession.loading = arg(false)); + expect(mockUserUISession.unsuccessJoined).returns(fakeUIUnsuccessConnectedSignal); + expect(fakeUIUnsuccessConnectedSignal.dispatch("connectionFailed")); + instance.execute(); + } + + [After] + public function tearDown():void + { + instance = null; + } + } } \ No newline at end of file diff --git a/tests/org/bigbluebutton/command/ShareCameraCommandTest.as b/tests/org/bigbluebutton/command/ShareCameraCommandTest.as index bc5d25b..e46c1a9 100644 --- a/tests/org/bigbluebutton/command/ShareCameraCommandTest.as +++ b/tests/org/bigbluebutton/command/ShareCameraCommandTest.as @@ -79,7 +79,7 @@ package org.bigbluebutton.command } /* Mockolate does not allow the mocking and stubbing of static methods. Camera objects are got via - * the 'Camera.getCamera()' method, which is static. Therefore, I am not sure how to properly have + * the 'Camera.getCamera()' method, which is static. So, I am not sure how to properly have * this return null/'my-fake-camera' for the following three tests... - Adam */ [Test] public function execute_cameraIsNull_startPublishingIsNotInvoked():void diff --git a/tests/org/bigbluebutton/command/ShareMicrophoneCommandTest.as b/tests/org/bigbluebutton/command/ShareMicrophoneCommandTest.as index 1cf1876..efb1247 100644 --- a/tests/org/bigbluebutton/command/ShareMicrophoneCommandTest.as +++ b/tests/org/bigbluebutton/command/ShareMicrophoneCommandTest.as @@ -1,17 +1,59 @@ package org.bigbluebutton.command { + import flash.net.NetConnection; + + import mockolate.*; + import mockolate.runner.MockolateRule; + + import org.bigbluebutton.core.VoiceConnection; + import org.bigbluebutton.core.VoiceStreamManager; + import org.bigbluebutton.model.IConferenceParameters; + import org.bigbluebutton.model.IUserSession; import org.flexunit.asserts.assertTrue; + import org.hamcrest.assertThat; + import org.osflash.signals.ISignal; + import org.osflash.signals.Signal; import robotlegs.bender.bundles.mvcs.Command; public class ShareMicrophoneCommandTest - { + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + [Mock] + public var mockUserSession:IUserSession; + + [Mock] + public var mockConferenceParameters:IConferenceParameters; + + [Mock] + public var mockVoiceStreamManager:VoiceStreamManager; + + [Mock] + public var mockVoiceConnection:VoiceConnection; + + [Mock] + public var mockNetConnection:NetConnection; + +// [Mock] + public var mockSuccessConnectedSignal:Signal = new Signal(); + +// [Mock] + public var mockUnuccessConnectedSignal:Signal = new Signal(); + protected var instance:ShareMicrophoneCommand; [Before] public function setUp():void { instance = new ShareMicrophoneCommand(); + instance.userSession = mockUserSession; + instance.conferenceParameters = mockConferenceParameters; + stub(mockUserSession).getter("voiceConnection").returns(mockVoiceConnection); + stub(mockVoiceConnection).getter("connection").returns(mockNetConnection); + stub(mockVoiceConnection).getter("successConnected").returns(mockSuccessConnectedSignal); + stub(mockVoiceConnection).getter("unsuccessConnected").returns(mockUnuccessConnectedSignal); } [After] @@ -20,6 +62,62 @@ package org.bigbluebutton.command instance = null; } + [Test] + public function execute_enabledIsFalse_closeInvokedOnVoiceStreamManager():void + { + instance.enabled = false; + stub(mockUserSession).getter("voiceStreamManager").returns(mockVoiceStreamManager); + expect(instance.userSession.voiceStreamManager.close()).once(); + instance.execute(); + } + + [Test] + public function execute_voiceConnectionNotEstablished_connectInvokedOnVoiceConnection():void + { + instance.enabled = true; + stub(mockNetConnection).getter("connected").returns(false); + expect(instance.userSession.voiceConnection.connect(mockConferenceParameters)).once(); + instance.execute(); + } + + [Test] + public function execute_voiceConnectionCallNotActive_CallInvokedOnVoiceConnection():void + { + instance.enabled = true; + stub(mockNetConnection).getter("connected").returns(true); + stub(mockVoiceConnection).getter("callActive").returns(false); + expect(instance.userSession.voiceConnection.call()).once(); + instance.execute(); + } + + [Test] + public function execute_voiceConnectionCallAlreadyActive_NoMethodInvokedOnVoiceConnection():void + { + instance.enabled = true; + stub(mockNetConnection).getter("connected").returns(true); + stub(mockVoiceConnection).getter("callActive").returns(true); + expect(instance.userSession.voiceConnection.call()).never(); + instance.execute(); + assertThat(instance.userSession.voiceConnection, received().method("call").anyArgs().never()); + } + +/* DOES NOT WORK... The problem is because there is a locally constructed object in 'mediaSuccessConnected' method + (the VoiceStreamManager instance) that has many dependencies needed to work... I will come back to this later and + try to "Inject" the voice stream manager into the share mic command w/o breaking, so that I can try to mock it.. - Adam + + [Test] + public function execute_onConnectionSuccess_VoiceStreamManagerInitialized():void + { + instance.enabled = true; + stub(mockNetConnection).getter("connected").returns(false); + stub(mockUserSession).getter("voiceStreamManager").returns(mockVoiceStreamManager); + stub(mockVoiceConnection).method("connect").args(mockConferenceParameters).calls(mockSuccessConnectedSignal.dispatch, ["ABC", "XYZ", "PQR"]); + expect(mockVoiceStreamManager.play(mockVoiceConnection.connection, "XYZ")).once(); + expect(mockVoiceStreamManager.publish(mockVoiceConnection.connection, "ABC", "PQR")).once(); + instance.execute(); + } +*/ + [Test] public function instantiated_isInstanceOfShareCameraCommand():void { diff --git a/tests/org/bigbluebutton/model/UserListTest.as b/tests/org/bigbluebutton/model/UserListTest.as index 5488225..14704ee 100644 --- a/tests/org/bigbluebutton/model/UserListTest.as +++ b/tests/org/bigbluebutton/model/UserListTest.as @@ -1,13 +1,26 @@ package org.bigbluebutton.model { - import flash.events.Event; + import flash.events.EventDispatcher; - import org.flexunit.asserts.assertTrue; - import org.osflash.signals.Signal; + import mockolate.runner.MockolateRule; + + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.hamcrest.object.equalTo; public class UserListTest { - protected var instance:UserList; + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + + public var instance:UserList; + + /* Event dispatcher for the helper event types, defined in the 'UserListTestHelperEvents' class. They are used + * to check that signals are dispatched, and with the right arguments, by putting listener methods on the + * signals that dispatch an event if all goes well. If the signal is not dispatched, the method will not be + * invoked, and the test will timeout waiting for the event. If they are called, but with the wrong arguments, + * then the assertions within the listener method will fail. */ + public var dispatcher:EventDispatcher = new EventDispatcher(); [Before] public function setUp():void @@ -15,13 +28,749 @@ package org.bigbluebutton.model instance = new UserList(); } - [After] - public function tearDown():void + /* UserList::addUser tests */ + + [Test] + public function addUser_addingNewUser_userIsAddedToList():void { - instance = null; + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + assertThat(instance.hasUser("123")); + } + + [Test] + public function addUser_userAlreadyInUserList_userNotAddedAgain():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.addUser(newUser); + instance.addUser(newUser); + instance.addUser(newUser); + assertThat(instance.users.length, equalTo(1)); + } + + [Test] + public function addUser_addingMultipleUsers_allUsersAreAddedToList():void + { + var user1:User = createNewUser("111", "AAA"); + var user2:User = createNewUser("222", "BBB"); + var user3:User = createNewUser("333", "CCC"); + var user4:User = createNewUser("444", "DDD"); + + instance.addUser(user1); + instance.addUser(user2); + instance.addUser(user3); + instance.addUser(user4); + + assertThat(instance.hasUser("111")); + assertThat(instance.hasUser("222")); + assertThat(instance.hasUser("333")); + assertThat(instance.hasUser("444")); + } + + [Test] + public function addUser_newuserIsMe_newuserIsAssignedToMe():void + { + var newUser:User = createNewUser("123", "MEEE"); + instance.me.userID = "123"; + instance.addUser(newUser); + + assertThat(instance.me, equalTo(newUser)); + assertThat(newUser.me, equalTo(true)); + } + + [Test (async)] + public function addUser_addingUserWithStream_dispatchesHasStreamSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.hasStream = true; + instance.userChangeSignal.add(hasStreamSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.HAS_STREAM, 5000); + instance.addUser(newUser); + } + + private function hasStreamSignalChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUserByUserId("123"))); + assertThat(change, equalTo(UserList.HAS_STREAM)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.HAS_STREAM)); + } + + [Test (async)] + public function addUser_addingUserWithPresenterStatus_dispatchesPresenterSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.presenter = true; + instance.userChangeSignal.add(presenterSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.PRESENTER, 5000); + instance.addUser(newUser); + } + + private function presenterSignalChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUserByUserId("123"))); + assertThat(change, equalTo(UserList.PRESENTER)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.PRESENTER)); + } + + [Test (async)] + public function addUser_addingUserWithHandRaised_dispatchesRaiseHandSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.raiseHand = true; + instance.userChangeSignal.add(handRaisedSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.RAISE_HAND, 5000); + instance.addUser(newUser); } + private function handRaisedSignalChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUserByUserId("123"))); + assertThat(change, equalTo(UserList.RAISE_HAND)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.RAISE_HAND)); + } + + [Test (async)] + public function addUser_addingUserWithListenOnly_dispatchesListenOnlySignal():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.listenOnly = true; + instance.userChangeSignal.add(listenOnlySignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.LISTEN_ONLY, 5000); + instance.addUser(newUser); + } + + public function listenOnlySignalChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUserByUserId("123"))); + assertThat(change, equalTo(UserList.LISTEN_ONLY)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.LISTEN_ONLY)); + } + + [Test (async)] + public function addUser_addingUser_dispatchesUserAddedSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.userAddedSignal.add(userAddedSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.USER_ADDED, 5000); + instance.addUser(newUser); + } + + private function userAddedSignalChecker(newUser:User):void + { + assertThat(newUser, equalTo(instance.getUser("123"))); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.USER_ADDED)); + } + + /* UserList::hasUser tests */ + [Test] + public function hasUser_usersInUserList_hasUserReturnsTrue():void + { + var newUser1:User = createNewUser("111", "AAA"); + var newUser2:User = createNewUser("222", "BBB"); + var newUser3:User = createNewUser("333", "CCC"); + + instance.addUser(newUser1); + instance.addUser(newUser2); + instance.addUser(newUser3); + + assertThat(instance.hasUser("111"), equalTo(true)); + assertThat(instance.hasUser("222"), equalTo(true)); + assertThat(instance.hasUser("333"), equalTo(true)); + } + + [Test] + public function hasUser_userRemoved_hasUserReturnsFalse():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.removeUser("123"); + assertThat(instance.hasUser("123"), equalTo(false)); + } + + /* UserList::getUser tests */ + + [Test] + public function getUser_userInUserList_referenceToThatUserIsReturned():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + assertThat(instance.getUser("123"), equalTo(newUser)); + } + + [Test] + public function getUser_userRemoved_returnsNull():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.removeUser("123"); + assertThat(instance.getUser("123"), equalTo(null)); + } + + /* UserList::getUserByVoiceUserId tests */ + + [Test] + public function getUserByVoiceUserId_returnsCorrectUser():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.voiceUserId = "987"; + instance.addUser(newUser); + assertThat(instance.getUserByVoiceUserId("987"), equalTo(newUser)); + } + + [Test] + public function getUserByVoiceUserId_userRemoved_returnsNull():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.voiceUserId = "987"; + instance.addUser(newUser); + instance.removeUser("123"); + assertThat(instance.getUserByVoiceUserId("987"), equalTo(null)); + } + + /* UserList::removeUser tests */ + + [Test] + public function removeUser_userInUserList_removesUser():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.removeUser("123"); + assertThat(instance.users.length, equalTo(0)); + assertThat(instance.getUser("123"), equalTo(null)); + } + + [Test (async)] + public function removeUser_userInUserList_dispatchesUserRemovedSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.userRemovedSignal.add(userRemovedSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.USER_REMOVED, 5000); + instance.removeUser("123"); + } + + private function userRemovedSignalChecker(userID:String):void + { + assertThat(userID, equalTo("123")); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.USER_REMOVED)); + } + + [Test] + public function removeUser_userRemovedMultipleTimes_doesNothing():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.removeUser("123"); + instance.removeUser("123"); + instance.removeUser("123"); + assertThat(instance.users.length, equalTo(0)); + assertThat(instance.getUser("123"), equalTo(null)); + } + + /* UserList::getPresenter tests */ + + [Test] + public function getPresenter_presenterExists_returnsReferenceToPresenter():void + { + var newUser1:User = createNewUser("111", "AAA"); + var newUser2:User = createNewUser("222", "BBB"); + var newUser3:User = createNewUser("333", "CCC"); + + newUser1.presenter = true; + newUser2.presenter = false; + newUser3.presenter = false; + + instance.addUser(newUser1); + instance.addUser(newUser2); + instance.addUser(newUser3); + + assertThat(instance.getPresenter(), equalTo(newUser1)); + } + + [Test] + public function getPresenter_noPresenter_returnsNull():void + { + var newUser1:User = createNewUser("111", "AAA"); + var newUser2:User = createNewUser("222", "BBB"); + var newUser3:User = createNewUser("333", "CCC"); + + newUser1.presenter = false; + newUser2.presenter = false; + newUser3.presenter = false; + + instance.addUser(newUser1); + instance.addUser(newUser2); + instance.addUser(newUser3); + + assertThat(instance.getPresenter(), equalTo(null)); + } + + /* UserList::removePresenter tests */ + + [Test] + public function removePresenter_presenterExists_presenterStatusSetToFalse():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.presenter = true; + instance.addUser(newUser); + instance.removePresenter(); + assertThat(newUser.presenter, equalTo(false)); + assertThat(instance.getPresenter(), equalTo(null)); + } + + [Test] + public function removePresenter_presenterIsMe_myPresenterStatusSetToFalse():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.me.userID = "123"; + newUser.presenter = true; + instance.addUser(newUser); + instance.removePresenter(); + assertThat(instance.me.presenter, equalTo(false)); + } + + [Test (async)] + public function removePresenter_presenterExists_dispatchesPresenterSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.presenter = true; + instance.addUser(newUser); + instance.userChangeSignal.add(removePresenterSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.REMOVED_PRESENTER, 5000); + instance.removePresenter(); + } + + private function removePresenterSignalChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUserByUserId("123"))); + assertThat(change, equalTo(UserList.PRESENTER)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.REMOVED_PRESENTER)); + } + + [Test] + public function removePresenter_removePresenterInvokedManyTimes_doesntBreak():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.presenter = true; + instance.addUser(newUser); + instance.removePresenter(); + instance.removePresenter(); + instance.removePresenter(); + assertThat(instance.me.presenter, equalTo(false)); + } + + [Test] + public function removePresenter_noPresenter_doesntBreak():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.presenter = false; + instance.addUser(newUser); + instance.removePresenter(); + } + + /* UserList::assignPresenter tests */ + + [Test] + public function assignPresenter_assignsPresenter():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.assignPresenter("123"); + assertThat(newUser.presenter, equalTo(true)); + } + + [Test (async)] + public function assignPresenter_dispatchesPresenterSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.userChangeSignal.add(assignPresenterSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.ASSIGN_PRESENTER, 5000); + instance.assignPresenter("123"); + } + + private function assignPresenterSignalChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUser("123"))); + assertThat(change, equalTo(UserList.PRESENTER)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.ASSIGN_PRESENTER)); + } + + [Test] + public function assignPresenter_oldPresenterIsCleared():void + { + var oldPresenter:User = createNewUser("111", "AAA"); + var newPresenter:User = createNewUser("222", "BBB"); + oldPresenter.presenter = true; + newPresenter.presenter = false; + + instance.addUser(oldPresenter); + instance.addUser(newPresenter); + instance.assignPresenter("222"); + + assertThat(oldPresenter.presenter, equalTo(false)); + } + + [Test] + public function assignPresenter_newPresenterIsMe_setsMyPresenterStateToTrue():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.me = true; + instance.addUser(newUser); + instance.assignPresenter("123"); + assertThat(instance.me.presenter, equalTo(true)); + } + + [Test] + public function assignPresenter_oldPresenterIsMe_setsMyPresenterStateToFalse():void + { + var oldPresenter:User = createNewUser("111", "AAA"); + var newPresenter:User = createNewUser("222", "BBB"); + oldPresenter.presenter = true; + oldPresenter.me = true; + newPresenter.presenter = false; + + instance.addUser(oldPresenter); + instance.addUser(newPresenter); + instance.assignPresenter("222"); + + assertThat(instance.me.presenter, equalTo(false)); + } + + [Test] + public function assignPresenter_invalidUserID_doesntBreak():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.removeUser("123"); + instance.assignPresenter("123"); + instance.assignPresenter("invalid_id"); + } + + /* UserList::userStreamChange tests */ + + [Test] + public function userStreamChange_setsHasStreamAndStreamNameProperties():void + { + var newUser1:User = createNewUser("111", "AAA"); + newUser1.hasStream = false; + newUser1.streamName = ""; + + var newUser2:User = createNewUser("222", "BBB"); + newUser2.hasStream = true; + newUser1.streamName = "some_stream_name"; + + instance.addUser(newUser1); + instance.addUser(newUser2); + instance.userStreamChange("111", true, "some_other_stream_name"); + instance.userStreamChange("222", false, ""); + + assertThat(newUser1.hasStream, equalTo(true)); + assertThat(newUser1.streamName, equalTo("some_other_stream_name")); + assertThat(newUser2.hasStream, equalTo(false)); + assertThat(newUser2.streamName, equalTo("")); + } + + [Test (async)] + public function userStreamChange_dispatchesHasStreamSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.userChangeSignal.add(streamChangeChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.STREAM_CHANGE); + instance.userStreamChange("123", true, "some_stream_name"); + } + + private function streamChangeChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUser("123"))); + assertThat(change, equalTo(UserList.HAS_STREAM)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.STREAM_CHANGE)); + } + + [Test] + public function userStreamChange_invalidUserID_doesntBreak():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.removeUser("123"); + instance.userStreamChange("123", true, "some_stream_name"); + instance.userStreamChange("invalid_id", true, "some_stream_name"); + } + + /* UserList::raiseHandChange tests */ + + [Test] + public function raiseHandChange_setsRaiseHandProperty():void + { + var newUser1:User = createNewUser("111", "AAA"); + newUser1.raiseHand = true; + + var newUser2:User = createNewUser("222", "BBB"); + newUser2.raiseHand = false; + + instance.addUser(newUser1); + instance.addUser(newUser2); + instance.raiseHandChange("111", false); + instance.raiseHandChange("222", true); + + assertThat(newUser1.raiseHand, equalTo(false)); + assertThat(newUser2.raiseHand, equalTo(true)); + } + + [Test (async)] + public function raiseHandChange_dispatchesRaiseHandSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.userChangeSignal.add(raiseHandSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.RAISE_HAND_CHANGE, 5000); + instance.raiseHandChange("123", true); + } + + private function raiseHandSignalChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUser("123"))); + assertThat(change, equalTo(UserList.RAISE_HAND)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.RAISE_HAND_CHANGE)); + } + + [Test] + public function raiseHandChange_invalidUserID_doesntBreak():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.removeUser("123"); + instance.raiseHandChange("123", true); + instance.raiseHandChange("invalid_id", true); + } + + /* UserList::userJoinAudio tests */ + + [Test] + public function userJoinAudio_setsPropertiesOnUser_1():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.userJoinAudio("123", "voice_id", true, false, false); + + assertThat(newUser.voiceJoined, equalTo(true)); + assertThat(newUser.voiceUserId, equalTo("voice_id")); + assertThat(newUser.muted, equalTo(true)); + assertThat(newUser.talking, equalTo(false)); + assertThat(newUser.locked, equalTo(false)); + } + + [Test] + public function userJoinAudio_setsPropertiesOnUser_2():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.userJoinAudio("123", "voice_id", false, true, false); + + assertThat(newUser.voiceJoined, equalTo(true)); + assertThat(newUser.voiceUserId, equalTo("voice_id")); + assertThat(newUser.muted, equalTo(false)); + assertThat(newUser.talking, equalTo(true)); + assertThat(newUser.locked, equalTo(false)); + } + + [Test (async)] + public function userJoinAudio_dispatchesJoinAudioSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.userChangeSignal.add(joinAudioSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.JOIN_AUDIO, 5000); + instance.userJoinAudio("123", "voice_id", false, false, false); + } + + private function joinAudioSignalChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUser("123"))); + assertThat(change, equalTo(UserList.JOIN_AUDIO)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.JOIN_AUDIO)); + } + + [Test] + public function userJoinAudio_invalidUserID_doesntBreak():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.removeUser("123"); + instance.userJoinAudio("123", "voice_id", false, false, false); + instance.userJoinAudio("invalid_id", "voice_id", false, false, false); + } + + /* UserList::userLeaveAudio tests */ + + [Test] + public function userLeaveAudio_setsVoiceJoinedPropertyToFalse():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.voiceJoined = true; + instance.addUser(newUser); + instance.userLeaveAudio("123"); + assertThat(newUser.voiceJoined, equalTo(false)); + } + + [Test (async)] + public function userLeaveAudio_dispatchesJoinAudioSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.voiceJoined = true; + instance.addUser(newUser); + instance.userChangeSignal.add(leaveAudioSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.LEAVE_AUDIO); + instance.userLeaveAudio("123"); + } + + private function leaveAudioSignalChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUser("123"))); + assertThat(change, equalTo(UserList.JOIN_AUDIO)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.LEAVE_AUDIO)); + } + + [Test] + public function userLeaveAudio_invalidUserID_doesntBreak():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.removeUser("123"); + instance.userLeaveAudio("123"); + instance.userLeaveAudio("invalid_id"); + } + + /* UserList::userMuteChange tests */ + + [Test] + public function userMuteChange_setsMuteProperty():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.voiceUserId = "voice_id"; + newUser.muted = true; + instance.addUser(newUser); + instance.userMuteChange("voice_id", false); + assertThat(newUser.muted, equalTo(false)); + } + + [Test] + public function userMuteChange_userMutedWhileTalking_setsTalkingToFalse():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.voiceUserId = "voice_id"; + newUser.muted = false; + newUser.talking = true; + instance.addUser(newUser); + instance.userMuteChange("voice_id", true); + assertThat(newUser.muted, equalTo(true)); + assertThat(newUser.talking, equalTo(false)); + } + + [Test (async)] + public function userMuteChange_dispatchesMuteSignal():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.voiceUserId = "voice_id"; + instance.addUser(newUser); + instance.userChangeSignal.add(muteSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.MUTE_CHANGE, 5000); + instance.userMuteChange("voice_id", true); + } + + private function muteSignalChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUser("123"))); + assertThat(change, equalTo(UserList.MUTE)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.MUTE_CHANGE)); + } + + [Test] + public function userMuteChange_invalidUserID_doesntBreak():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.voiceUserId = "voice_id"; + instance.addUser(newUser); + instance.removeUser("123"); + instance.userMuteChange("voice_id", true); + instance.userMuteChange("invalid_voice_id", true); + } + + /* UserList::userTalkingChange tests */ + + [Test] + public function userTalkingChange_setsTalkingProperty():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.voiceUserId = "voice_id"; + newUser.talking = false; + instance.addUser(newUser); + instance.userTalkingChange("voice_id", true); + assertThat(newUser.talking, equalTo(true)); + } + + [Test] + public function userTalkingChange_invalidUserID_doesntBreak():void + { + var newUser:User = createNewUser("123", "ABC"); + newUser.voiceUserId = "voice_id"; + instance.addUser(newUser); + instance.removeUser("123"); + instance.userTalkingChange("voice_id", true); + instance.userTalkingChange("invalid_voice_id", true); + } + + /* UserList::listenOnlyChange tests */ + + [Test] + public function listenOnlyChange_setsListenOnlyProperty():void + { + var newUser1:User = createNewUser("111", "AAA"); + newUser1.listenOnly = true; + + var newUser2:User = createNewUser("222", "BBB"); + newUser2.listenOnly = false; + + instance.addUser(newUser1); + instance.addUser(newUser2); + instance.listenOnlyChange("111", false); + instance.listenOnlyChange("222", true); + + assertThat(newUser1.listenOnly, equalTo(false)); + assertThat(newUser2.listenOnly, equalTo(true)); + } + + [Test (async)] + public function listenOnlyChange_dispatcherListOnlySignal():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.userChangeSignal.add(listenOnlyChangeSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserListTestHelperEvents.LISTEN_ONLY_CHANGE, 5000); + instance.listenOnlyChange("123", true); + } + + private function listenOnlyChangeSignalChecker(user:User, change:int):void + { + assertThat(user, equalTo(instance.getUser("123"))); + assertThat(change, equalTo(UserList.LISTEN_ONLY)); + dispatcher.dispatchEvent(new UserListTestHelperEvents(UserListTestHelperEvents.LISTEN_ONLY_CHANGE)); + } + + [Test] + public function listenOnlyChange_invalidUserID_doesntBreak():void + { + var newUser:User = createNewUser("123", "ABC"); + instance.addUser(newUser); + instance.removeUser("123"); + instance.listenOnlyChange("123", true); + instance.listenOnlyChange("invalid_id", true); + } + +/* [Test] public function instantiated_isInstanceOfUserList():void { assertTrue("instance is UserList", instance is UserList); @@ -52,6 +801,39 @@ package org.bigbluebutton.model private function listener(e : Event) : void { + }*/ + + [After] + public function tearDown():void + { + instance = null; + } + + /* Helper function to generate fake user instances. Some properties are already defaulted accordingly in the + * definition of the User class, but to be consistent, they are all set here. */ + private function createNewUser(userID:String, name:String):User + { + var newUser:User = new User(); + + newUser.userID = userID; + newUser.name = name; + + newUser.hasStream = false; + newUser.isLeavingFlag = false; + newUser.listenOnly = false; + newUser.locked = false; + newUser.me = false; + newUser.muted = false; + newUser.phoneUser = false; + newUser.presenter = false; + newUser.raiseHand = false; + newUser.role = User.VIEWER; + newUser.streamName = ""; + newUser.talking = false; + newUser.voiceJoined = false; + newUser.voiceUserId = ""; + + return newUser; } } } diff --git a/tests/org/bigbluebutton/model/UserListTestHelperEvents.as b/tests/org/bigbluebutton/model/UserListTestHelperEvents.as new file mode 100644 index 0000000..4e8ebb8 --- /dev/null +++ b/tests/org/bigbluebutton/model/UserListTestHelperEvents.as @@ -0,0 +1,28 @@ +package org.bigbluebutton.model +{ + import flash.events.Event; + + public class UserListTestHelperEvents extends Event + { + public static const HAS_STREAM:String = "HAS_STREAM"; + public static const PRESENTER:String = "PRESENTER"; + public static const RAISE_HAND:String = "RAISE_HAND"; + public static const LISTEN_ONLY:String = "LISTEN_ONLY"; + public static const USER_ADDED:String = "USER_ADDED"; + public static const USER_REMOVED:String = "USER_REMOVED"; + public static const REMOVED_PRESENTER:String = "REMOVED_PRESENTER"; + public static const ASSIGN_PRESENTER:String = "ASSIGN_PRESENTER"; + public static const STREAM_CHANGE:String = "STREAM_CHANGE_HAS_STREAM"; + public static const RAISE_HAND_CHANGE:String = "RAISE_HAND_CHANGE"; + public static const JOIN_AUDIO:String = "JOIN_AUDIO"; + public static const LEAVE_AUDIO:String = "LEAVE_AUDIO"; + public static const MUTE_CHANGE:String = "MUTE_CHANGE"; + public static const LISTEN_ONLY_CHANGE:String = "LISTEN_ONLY_CHANGE"; + + + public function UserListTestHelperEvents(type:String):void + { + super(type); + } + } +} \ No newline at end of file From ad78179701b70f9b92c105f92e62aa4fd57492f0 Mon Sep 17 00:00:00 2001 From: Adam Sharpe Date: Thu, 6 Nov 2014 17:53:23 -0500 Subject: [PATCH 08/10] Chat and UserUISession unit tests --- .../bigbluebutton/model/UserUISessionTest.as | 184 +++++++++++++++++- .../model/UserUISessionTestHelperEvents.as | 16 ++ .../model/chat/ChatMessageTest.as | 30 ++- .../model/chat/ChatMessagesSessionTest.as | 130 ++++++++++++- .../ChatMessagesSessionTestHelperEvents.as | 14 ++ .../model/chat/ChatMessagesTest.as | 165 +++++++++++++++- .../chat/ChatMessagesTestHelperEvents.as | 15 ++ 7 files changed, 546 insertions(+), 8 deletions(-) create mode 100644 tests/org/bigbluebutton/model/UserUISessionTestHelperEvents.as create mode 100644 tests/org/bigbluebutton/model/chat/ChatMessagesSessionTestHelperEvents.as create mode 100644 tests/org/bigbluebutton/model/chat/ChatMessagesTestHelperEvents.as diff --git a/tests/org/bigbluebutton/model/UserUISessionTest.as b/tests/org/bigbluebutton/model/UserUISessionTest.as index 616b144..ecd2896 100644 --- a/tests/org/bigbluebutton/model/UserUISessionTest.as +++ b/tests/org/bigbluebutton/model/UserUISessionTest.as @@ -1,24 +1,204 @@ package org.bigbluebutton.model { + import flash.events.EventDispatcher; + + import flashx.textLayout.debug.assert; + + import mockolate.runner.MockolateRule; + + import org.bigbluebutton.view.navigation.pages.TransitionAnimationENUM; import org.flexunit.asserts.assertTrue; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.hamcrest.object.equalTo; public class UserUISessionTest { protected var instance:UserUISession; + /* Event dispatcher for the helper event types, defined in the 'UserListTestHelperEvents' class. They are used + * to check that signals are dispatched, and with the right arguments, by putting listener methods on the + * signals that dispatch an event if all goes well. If the signal is not dispatched, the method will not be + * invoked, and the test will timeout waiting for the event. If they are called, but with the wrong arguments, + * then the assertions within the listener method will fail. */ + public var dispatcher:EventDispatcher = new EventDispatcher(); + [Before] public function setUp():void { instance = new UserUISession(); + instance.pushPage("page 1", "details 1", TransitionAnimationENUM.APPEAR); + instance.pushPage("page 2", "details 2", TransitionAnimationENUM.SLIDE_LEFT); + instance.pushPage("page 3", "details 3", TransitionAnimationENUM.SLIDE_RIGHT); + } + + /* UserUISession::currentPage getter tests */ + + [Test] + public function currentPage_returnsCurrentPageName():void + { + var currPage:String = instance.currentPage; + assertThat(currPage, equalTo("page 3")); + } + + [Test] + public function currentPage_listPagesIsEmpty_returnsNull():void + { + instance.popPage(); + instance.popPage(); + instance.popPage(); + + var currPage:String = instance.currentPage; + assertThat(currPage, equalTo(null)); + } + + /* UserUISession::lastPage getter tests */ + + [Test] + public function lastPage_returnsLastPageName():void + { + var lastPage:String = instance.lastPage; + assertThat(lastPage, equalTo("page 2")); + } + + [Test] + public function lastPage_listPagesHasOnlyOnePage_returnsNull():void + { + instance.popPage(); + instance.popPage(); + + var lastPage:String = instance.lastPage; + assertThat(lastPage, equalTo(null)); + } + + [Test] + public function lastPage_listPagesIsEmpty_returnsNull():void + { + instance.popPage(); + instance.popPage(); + instance.popPage(); + + var lastPage:String = instance.lastPage; + assertThat(lastPage, equalTo(null)); } + /* UserUISession::pushPage tests */ + + [Test] + public function pushPage_currentPageIsThatPage():void + { + instance.pushPage("new page", "new page details", TransitionAnimationENUM.APPEAR); + assertThat(instance.currentPage, equalTo("new page")); + assertThat(instance.lastPage, equalTo("page 3")); + } + + [Test (async)] + public function pushPage_pageAdded_dispatchesPageChangedSignal():void + { + instance.pageChangedSignal.add(pushPageSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserUISessionTestHelperEvents.PUSH_PAGE_SIGNAL_CORRECT, 5000); + instance.pushPage("new page", "new page details", TransitionAnimationENUM.SLIDE_LEFT); + } + + private function pushPageSignalChecker(pageName:String, removeView:Boolean, animation:int):void + { + assertThat(pageName, equalTo("new page")); + assertThat(removeView, equalTo(false)); + assertThat(animation, equalTo(TransitionAnimationENUM.SLIDE_LEFT)); + dispatcher.dispatchEvent(new UserUISessionTestHelperEvents(UserUISessionTestHelperEvents.PUSH_PAGE_SIGNAL_CORRECT)); + } + + [Test] + public function pushPage_pageAddedIsCurrentPage_pageNotAddedAgain():void + { + instance.pushPage("double page", "double page details"); + instance.pushPage("double page", "double page details"); + assertThat(instance.lastPage, equalTo("page 3")); + } + + /* UserUISession::popPage tests */ + + [Test] + public function popPage_removesPageFromPageList():void + { + instance.popPage(); + assertThat(instance.currentPage, equalTo("page 2")); + instance.popPage(); + assertThat(instance.currentPage, equalTo("page 1")); + instance.popPage(); + assertThat(instance.currentPage, equalTo(null)); + } + + [Test (async)] + public function popPage_removesPage_dispatchesPageChangedSignal():void + { + instance.pageChangedSignal.add(popPageSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserUISessionTestHelperEvents.POP_PAGE_SIGNAL_CORRECT, 5000); + instance.popPage(TransitionAnimationENUM.SLIDE_LEFT); + } + + private function popPageSignalChecker(pageName:String, removeView:Boolean, animation:int):void + { + assertThat(pageName, equalTo("page 2")); + assertThat(removeView, equalTo(true)); + assertThat(animation, equalTo(TransitionAnimationENUM.SLIDE_LEFT)); + dispatcher.dispatchEvent(new UserUISessionTestHelperEvents(UserUISessionTestHelperEvents.POP_PAGE_SIGNAL_CORRECT)); + } + + [Test] + public function popPage_pageListIsEmpty_doesNothing():void + { + instance.popPage(); + instance.popPage(); + instance.popPage(); + assertThat(instance.currentPage, equalTo(null)); + + instance.popPage(); + assertThat(instance.currentPage, equalTo(null)); + } + + /* UserUISession::currentPageDetails (getter) tests */ + + [Test] + public function currentPageDetails_returnsDetails():void + { + instance.pushPage("new page", "new page details"); + assertThat(instance.currentPageDetails, equalTo("new page details")); + } + + [Test] + public function currentPageDetails_pageListIsEmpty_returnsNull():void + { + instance.popPage(); + instance.popPage(); + instance.popPage(); + assertThat(instance.currentPageDetails, equalTo(null)); + } + + /* UserUISession::loading (setter) tests */ + + [Test (async)] + public function loading_dispatchedLoadingSignal():void + { + instance.loadingSignal.add(loadingSignalChecker); + Async.proceedOnEvent(this, dispatcher, UserUISessionTestHelperEvents.LOADING_SIGNAL_CORRECT, 5000); + instance.loading = true; + } + + private function loadingSignalChecker(loading:Boolean):void + { + assertThat(loading, equalTo(true)); + dispatcher.dispatchEvent(new UserUISessionTestHelperEvents(UserUISessionTestHelperEvents.LOADING_SIGNAL_CORRECT)); + } + + [After] public function tearDown():void { instance = null; } - [Test] + /*[Test] public function instantiated_isInstanceOfUserUISession():void { assertTrue("instance is UserSession", instance is UserUISession); @@ -28,6 +208,6 @@ package org.bigbluebutton.model public function instantiated_implementsIUserUISession():void { assertTrue("instance implements IUserUISession interface", instance is IUserUISession); - } + }*/ } } \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/UserUISessionTestHelperEvents.as b/tests/org/bigbluebutton/model/UserUISessionTestHelperEvents.as new file mode 100644 index 0000000..5910166 --- /dev/null +++ b/tests/org/bigbluebutton/model/UserUISessionTestHelperEvents.as @@ -0,0 +1,16 @@ +package org.bigbluebutton.model +{ + import flash.events.Event; + + public class UserUISessionTestHelperEvents extends Event + { + public static const PUSH_PAGE_SIGNAL_CORRECT:String = "PUSH_PAGE_SIGNAL_CORRECT"; + public static const POP_PAGE_SIGNAL_CORRECT:String = "POP_PAGE_SIGNAL_CORRECT"; + public static const LOADING_SIGNAL_CORRECT:String = "LOADING_SIGNAL_CORRECT"; + + public function UserUISessionTestHelperEvents(type:String):void + { + super(type); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/ChatMessageTest.as b/tests/org/bigbluebutton/model/chat/ChatMessageTest.as index 3d5ab5b..f39b76c 100644 --- a/tests/org/bigbluebutton/model/chat/ChatMessageTest.as +++ b/tests/org/bigbluebutton/model/chat/ChatMessageTest.as @@ -1,9 +1,16 @@ package org.bigbluebutton.model.chat { + import mockolate.runner.MockolateRule; + import org.flexunit.asserts.assertTrue; + import org.hamcrest.assertThat; + import org.hamcrest.object.equalTo; public class ChatMessageTest - { + { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + protected var instance:ChatMessage; [Before] @@ -12,16 +19,33 @@ package org.bigbluebutton.model.chat instance = new ChatMessage(); } + /* ChatMessage::toString tests */ + + /* The behaviour of the ChatMessage::toString should be to strip XML tags from the chat message */ + [Test] + public function toString_containsXMLTags_stripsTags():void + { + instance.name = "some-guy's-name"; + instance.time = "some-time"; + instance.translatedText = "this is a chat message!!"; + + var noTagsString:String = instance.toString(); + + /* toString() also adds stuff to the beginning and end of the translated text, which is why the safe string + * has the value that is does. The important part, is that the tags get stripped. */ + assertThat(noTagsString, equalTo("Chat message some-guy's-name said this is a chat message!! at some-time")); + } + [After] public function tearDown():void { instance = null; } - +/* [Test] public function instantiated_isInstanceOfChatMessage():void { assertTrue("instance is ChatMessage", instance is ChatMessage); - } + }*/ } } \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/ChatMessagesSessionTest.as b/tests/org/bigbluebutton/model/chat/ChatMessagesSessionTest.as index 923c326..7e75e47 100644 --- a/tests/org/bigbluebutton/model/chat/ChatMessagesSessionTest.as +++ b/tests/org/bigbluebutton/model/chat/ChatMessagesSessionTest.as @@ -1,23 +1,151 @@ package org.bigbluebutton.model.chat { + import flash.events.Event; + import flash.events.EventDispatcher; + + import mockolate.runner.MockolateRule; + import org.flexunit.asserts.assertTrue; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.hamcrest.object.equalTo; public class ChatMessagesSessionTest { + [Rule] + public var mockolateRule:MockolateRule = new MockolateRule(); + protected var instance:ChatMessagesSession; + /* Event dispatcher for the helper event types, defined in the 'UserListTestHelperEvents' class. They are used + * to check that signals are dispatched, and with the right arguments, by putting listener methods on the + * signals that dispatch an event if all goes well. If the signal is not dispatched, the method will not be + * invoked, and the test will timeout waiting for the event. If they are called, but with the wrong arguments, + * then the assertions within the listener method will fail. */ + private var dispatcher:EventDispatcher = new EventDispatcher(); + [Before] public function setUp():void { instance = new ChatMessagesSession(); } + /* ChatMessagesSession::addUserToPrivateMessages tests */ + + [Test] + public function addUserToPrivateMessages_userAddedToPrivateChat():void + { + instance.addUserToPrivateMessages("123", "ABC"); + var pm:PrivateChatMessage = instance.privateChats.getItemAt(0) as PrivateChatMessage; + assertThat(pm.userID, equalTo("123")); + assertThat(pm.userName, equalTo("ABC")); + } + + /* ChatMessagesSession::newPrivateMessage tests */ + + [Test] + public function newPrivateMessage_fromNewUser_newUserAddedtoPrivateChatsList():void + { + assertThat(instance.privateChats.length, equalTo(0)); + var message:ChatMessageVO = createChatMessageVO("chat message text"); + instance.newPrivateMessage("123", "ABC", message); + assertThat(instance.privateChats.length, equalTo(1)); + + var pm:PrivateChatMessage = instance.privateChats.getItemAt(0) as PrivateChatMessage; + assertThat(pm.userID, equalTo("123")); + assertThat(pm.userName, equalTo("ABC")); + } + + [Test] + public function newPrivateMessage_fromNotNewUser_ChatMessagesFromThatUserAreUpdated():void + { + var message1:ChatMessageVO = createChatMessageVO("chat message text 1"); + instance.newPrivateMessage("123", "ABC", message1); + var message2:ChatMessageVO = createChatMessageVO("chat message text 2"); + instance.newPrivateMessage("123", "ABC", message2); + var message3:ChatMessageVO = createChatMessageVO("chat message text 3"); + instance.newPrivateMessage("123", "ABC", message3); + + assertThat(instance.privateChats.length, equalTo(1)); + + var pm:PrivateChatMessage = instance.privateChats.getItemAt(0) as PrivateChatMessage; + var cm:ChatMessages = pm.privateChat as ChatMessages; + assertThat(cm.messages.getItemAt(0).senderText, equalTo("chat message text 1")); + assertThat(cm.messages.getItemAt(1).senderText, equalTo("chat message text 2")); + assertThat(cm.messages.getItemAt(2).senderText, equalTo("chat message text 3")); + } + + [Test (async)] + public function newPrivateMessage_dispatchesChatMessageChangeSignal():void + { + var message:ChatMessageVO = createChatMessageVO("chat message text"); + instance.chatMessageChangeSignal.add(chatMessageChangeSignalChecker); + Async.proceedOnEvent(this, dispatcher, ChatMessagesSessionTestHelperEvents.CHAT_MESSAGE_CHANGE_SIGNAL_CORRECT, 5000); + instance.newPrivateMessage("123", "ABC", message); + } + + private function chatMessageChangeSignalChecker(userID:String):void + { + assertThat(userID, equalTo("123")); + dispatcher.dispatchEvent(new ChatMessagesSessionTestHelperEvents( + ChatMessagesSessionTestHelperEvents.CHAT_MESSAGE_CHANGE_SIGNAL_CORRECT)); + } + + /* ChatMessagesSession::getPrivateMessages tests */ + + [Test] + public function getPrivateChatMessages_userInList_returnsListOfChatMessagesFromThatUser():void + { + var message1:ChatMessageVO = createChatMessageVO("chat message text 1"); + instance.newPrivateMessage("123", "ABC", message1); + var message2:ChatMessageVO = createChatMessageVO("chat message text 2"); + instance.newPrivateMessage("123", "ABC", message2); + var message3:ChatMessageVO = createChatMessageVO("chat message text 3"); + instance.newPrivateMessage("123", "ABC", message3); + + var pm:PrivateChatMessage = instance.getPrivateMessages("123", "ABC"); + var cm:ChatMessages = pm.privateChat as ChatMessages; + assertThat(cm.messages.getItemAt(0).senderText, equalTo("chat message text 1")); + assertThat(cm.messages.getItemAt(1).senderText, equalTo("chat message text 2")); + assertThat(cm.messages.getItemAt(2).senderText, equalTo("chat message text 3")); + } + + [Test] + public function getPrivateChatMessages_userNotInList_userAddedWithEmptyMessageList():void + { + assertThat(instance.privateChats.length, equalTo(0)); + var pm:PrivateChatMessage = instance.getPrivateMessages("123", "ABC"); + assertThat(instance.privateChats.length, equalTo(1)); + assertThat(pm.privateChat.messages.length, equalTo(0)); + } + + /* helpers */ + + private function createChatMessageVO(text:String):ChatMessageVO + { + var chatMessageVO:ChatMessageVO = new ChatMessageVO; + chatMessageVO.message = text; + + chatMessageVO.fromUserID = "sender ID"; + chatMessageVO.fromUsername = "sender name"; + chatMessageVO.toUserID = "receiver ID"; + chatMessageVO.toUsername = "receiver name"; + chatMessageVO.chatType = "public"; + chatMessageVO.fromColor = "0x000000"; + chatMessageVO.fromTime = 0; + chatMessageVO.fromLang = "language"; + chatMessageVO.fromTimezoneOffset = 0; + + return chatMessageVO; + } + [After] public function tearDown():void { instance = null; } + /* [Test] public function instantiated_isInstanceOfChatMessagesSession():void { @@ -28,6 +156,6 @@ package org.bigbluebutton.model.chat public function instantiated_implementsIChatMessagesSessionInterface():void { assertTrue("instance implements IChatMessagesSession interface", instance is IChatMessagesSession); - } + }*/ } } \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/ChatMessagesSessionTestHelperEvents.as b/tests/org/bigbluebutton/model/chat/ChatMessagesSessionTestHelperEvents.as new file mode 100644 index 0000000..cfe06d6 --- /dev/null +++ b/tests/org/bigbluebutton/model/chat/ChatMessagesSessionTestHelperEvents.as @@ -0,0 +1,14 @@ +package org.bigbluebutton.model.chat +{ + import flash.events.Event; + + public class ChatMessagesSessionTestHelperEvents extends Event + { + public static const CHAT_MESSAGE_CHANGE_SIGNAL_CORRECT:String = "CHAT_MESSAGE_CHANGE_SIGNAL_CORRECT"; + + public function ChatMessagesSessionTestHelperEvents(type:String):void + { + super(type); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/ChatMessagesTest.as b/tests/org/bigbluebutton/model/chat/ChatMessagesTest.as index 690895d..cd895c0 100644 --- a/tests/org/bigbluebutton/model/chat/ChatMessagesTest.as +++ b/tests/org/bigbluebutton/model/chat/ChatMessagesTest.as @@ -1,27 +1,188 @@ package org.bigbluebutton.model.chat { + import flash.events.EventDispatcher; + + import org.bigbluebutton.util.ChatUtil; import org.flexunit.asserts.assertTrue; + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.hamcrest.object.equalTo; public class ChatMessagesTest { protected var instance:ChatMessages; + /* Event dispatcher for the helper event types, defined in the 'UserListTestHelperEvents' class. They are used + * to check that signals are dispatched, and with the right arguments, by putting listener methods on the + * signals that dispatch an event if all goes well. If the signal is not dispatched, the method will not be + * invoked, and the test will timeout waiting for the event. If they are called, but with the wrong arguments, + * then the assertions within the listener method will fail. */ + public var dispatcher:EventDispatcher = new EventDispatcher(); + [Before] public function setUp():void { instance = new ChatMessages(); } + /* ChatMessages::numMessages tests */ + + [Test] + public function numMessages_returnsNumberOfMessages():void + { + assertThat(instance.numMessages(), equalTo(0)); + instance.newChatMessage(createChatMessageVO("message 1")); + instance.newChatMessage(createChatMessageVO("message 2")); + instance.newChatMessage(createChatMessageVO("message 3")); + assertThat(instance.numMessages(), equalTo(3)); + } + + /* ChatMessages::newChatMessage tests */ + + [Test] + public function newChatMessage_addsMessageToMessagesList():void + { + var message:ChatMessageVO = createChatMessageVO("chat message text"); + instance.newChatMessage(message); + assertThat(instance.numMessages(), equalTo(1)); + + var m:ChatMessage = instance.messages.getItemAt(0) as ChatMessage; + + assertThat(m.senderId , equalTo(message.fromUserID)); + + assertThat(m.senderLanguage , equalTo(message.fromLang)); + assertThat(m.receiverLanguage, equalTo(ChatUtil.getUserLang())); + + assertThat(m.translatedText, equalTo(message.message)); + assertThat(m.senderText, equalTo(message.message)); + + assertThat(m.name , equalTo(message.fromUsername)); + assertThat(m.senderColor, equalTo(message.fromColor)); + assertThat(m.translatedColor, equalTo(uint(message.fromColor))); + + assertThat(m.fromTime , equalTo(message.fromTime)); + assertThat(m.fromTimezoneOffset , equalTo(message.fromTimezoneOffset)); + } + + [Test] + public function newChatMessage_newMessageAddedWithTime_timeStampCorrect():void + { + var message1:ChatMessageVO = createChatMessageVO("chat message text"); + var message2:ChatMessageVO = createChatMessageVO("chat message text"); + + /* The number in 'fromTime' field is to represent the number of milliseconds since January 1, 1970 */ + message1.fromTime = 1234; + message2.fromTime = 123456789101112; + + instance.newChatMessage(message1); + instance.newChatMessage(message2); + + var m1:ChatMessage = instance.messages.getItemAt(0) as ChatMessage; + var m2:ChatMessage = instance.messages.getItemAt(1) as ChatMessage; + + /* Verifies the format of the time stamp string. Should be "HOUR:MINUTE" */ + var testDate1:Date = new Date(); + testDate1.setTime(1234); + assertThat(m1.time, equalTo(ChatUtil.getHours(testDate1) + ":" + ChatUtil.getMinutes(testDate1))); + + var testDate2:Date = new Date(); + testDate2.setTime(123456789101112); + assertThat(m2.time, equalTo(ChatUtil.getHours(testDate2) + ":" + ChatUtil.getMinutes(testDate2))); + } + + [Test (async)] + public function newChatMessage_dispatchesChatMessageChangeSignal():void + { + var message:ChatMessageVO = createChatMessageVO("chat message text"); + message.fromUserID = "123"; + instance.chatMessageChangeSignal.add(chatMessageChangeSignalChecker); + Async.proceedOnEvent(this, dispatcher, ChatMessagesTestHelperEvents.CHAT_MESSAGES_SIGNAL_CORRECT, 5000); + instance.newChatMessage(message); + } + + private function chatMessageChangeSignalChecker(userID:String):void + { + assertThat(userID, equalTo("123")); + dispatcher.dispatchEvent(new ChatMessagesTestHelperEvents(ChatMessagesTestHelperEvents.CHAT_MESSAGES_SIGNAL_CORRECT)); + } + + [Test] + public function newChatMessage_chatMessageAdded_lastSenderIdSet():void + { + var message1:ChatMessageVO = createChatMessageVO("chat message text"); + message1.fromUserID = "AAA"; + instance.newChatMessage(message1); + + var message2:ChatMessageVO = createChatMessageVO("chat message text"); + message2.fromUserID = "BBB"; + instance.newChatMessage(message2); + + var m:ChatMessage = instance.messages.getItemAt(1) as ChatMessage; + assertThat(m.lastSenderId, equalTo("AAA")); + } + + [Test] + public function newChatMessage_firstChatMessage_lastSenderIdIsEmptyString():void + { + var message:ChatMessageVO = createChatMessageVO("chat message text"); + instance.newChatMessage(message); + var m:ChatMessage = instance.messages.getItemAt(0) as ChatMessage; + assertThat(m.lastSenderId, equalTo("")); + } + + /* ChatMessages::getAllMessageAsString tests */ + + /* I don't think this is used anywhere... maybe remove this method? What is its purpose?? */ + + + + /* ChatMessages::resetNewMessages tests */ + + [Test (async)] + public function resetNewMessages_dispatchesChatMessageChangeSignal():void + { + instance.chatMessageChangeSignal.add(chatMessageChangeOnResetSignalChecker); + Async.proceedOnEvent(this, dispatcher, ChatMessagesTestHelperEvents.CHAT_MESSAGES_RESET_SIGNAL_CORRECT, 5000); + instance.resetNewMessages(); + } + + private function chatMessageChangeOnResetSignalChecker(userID:String):void + { + assertThat(userID, equalTo(null)); + assertThat(instance.newMessages, equalTo(0)); + dispatcher.dispatchEvent(new ChatMessagesTestHelperEvents(ChatMessagesTestHelperEvents.CHAT_MESSAGES_RESET_SIGNAL_CORRECT)); + } + + /* helpers */ + + private function createChatMessageVO(text:String):ChatMessageVO + { + var chatMessageVO:ChatMessageVO = new ChatMessageVO; + chatMessageVO.message = text; + + chatMessageVO.fromUserID = "sender ID"; + chatMessageVO.fromUsername = "sender name"; + chatMessageVO.toUserID = "receiver ID"; + chatMessageVO.toUsername = "receiver name"; + chatMessageVO.chatType = "public"; + chatMessageVO.fromColor = "0x000000"; + chatMessageVO.fromTime = 0; + chatMessageVO.fromLang = "language"; + chatMessageVO.fromTimezoneOffset = 0; + + return chatMessageVO; + } + [After] public function tearDown():void { instance = null; } - [Test] +/* [Test] public function instantiated_isInstanceOfChatMessages():void { assertTrue("instance is ChatMessages", instance is ChatMessages); - } + }*/ } } \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/chat/ChatMessagesTestHelperEvents.as b/tests/org/bigbluebutton/model/chat/ChatMessagesTestHelperEvents.as new file mode 100644 index 0000000..da3bf99 --- /dev/null +++ b/tests/org/bigbluebutton/model/chat/ChatMessagesTestHelperEvents.as @@ -0,0 +1,15 @@ +package org.bigbluebutton.model.chat +{ + import flash.events.Event; + + public class ChatMessagesTestHelperEvents extends Event + { + public static const CHAT_MESSAGES_SIGNAL_CORRECT:String = "CHAT_MESSAGES_SIGNAL_CORRECT"; + public static const CHAT_MESSAGES_RESET_SIGNAL_CORRECT:String = "CHAT_MESSAGES_RESET_SIGNAL_CORRECT"; + + public function ChatMessagesTestHelperEvents(type:String):void + { + super(type); + } + } +} \ No newline at end of file From bfa8e12bc08a6f7f07777f6fa18df86db7841d99 Mon Sep 17 00:00:00 2001 From: Adam Sharpe Date: Mon, 10 Nov 2014 17:08:00 -0500 Subject: [PATCH 09/10] Finished unit tests for the model --- .../presentation/PresentationListTest.as | 101 ++++++++++- .../PresentationListTestHelperEvents.as | 14 ++ .../model/presentation/PresentationTest.as | 164 +++++++++++++++++- .../PresentationTestHelperEvents.as | 16 ++ .../model/presentation/SlideTest.as | 71 +++++++- .../presentation/SlideTestHelperEvents.as | 15 ++ 6 files changed, 369 insertions(+), 12 deletions(-) create mode 100644 tests/org/bigbluebutton/model/presentation/PresentationListTestHelperEvents.as create mode 100644 tests/org/bigbluebutton/model/presentation/PresentationTestHelperEvents.as create mode 100644 tests/org/bigbluebutton/model/presentation/SlideTestHelperEvents.as diff --git a/tests/org/bigbluebutton/model/presentation/PresentationListTest.as b/tests/org/bigbluebutton/model/presentation/PresentationListTest.as index 7ab30a4..4ad2493 100644 --- a/tests/org/bigbluebutton/model/presentation/PresentationListTest.as +++ b/tests/org/bigbluebutton/model/presentation/PresentationListTest.as @@ -1,15 +1,110 @@ package org.bigbluebutton.model.presentation { - import org.flexunit.asserts.assertTrue; + import flash.events.EventDispatcher; + + import mockolate.runner.MockolateRule; + + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.hamcrest.object.equalTo; + import org.hamcrest.object.notNullValue; public class PresentationListTest { protected var instance:PresentationList; + public var dispatcher:EventDispatcher = new EventDispatcher(); + [Before] public function setUp():void { instance = new PresentationList(); + var p:Presentation = instance.addPresentation("presentation name 1", 5, true); + instance.currentPresentation = p; + instance.addPresentation("presentation name 2", 10, false); + instance.addPresentation("presentation name 3", 20, false); + } + + /* PresentationList::addPresentation tests */ + + [Test] + public function addPresentation_createsAndAddsPresentationToPresentationList():void + { + instance.addPresentation("new presentation name", 15, false); + + var p:Presentation = instance.getPresentation("new presentation name"); + assertThat(p.fileName, equalTo("new presentation name")); + assertThat(p.size(), equalTo(15)); + assertThat(p.current, equalTo(false)); + } + + /* PresentationList::removePresentation tests */ + + [Test] + public function removePresentation_invalidPresentationName_doesntBreak():void + { + instance.removePresentation("invalid name"); + } + + [Test] + public function removePresentation_removesPresentationFromPresentationList():void + { + assertThat(instance.getPresentation("presentation name 1"), notNullValue()); + instance.removePresentation("presentation name 1"); + assertThat(instance.getPresentation("presentation name 1"), equalTo(null)); + } + + /* PresentationList::getPresentation tests */ + + [Test] + public function getPresentation_presentationInPresentationList_returnsPresentationReference():void + { + var p:Presentation = instance.getPresentation("presentation name 1"); + assertThat(p.fileName, equalTo("presentation name 1")); + assertThat(p.size(), equalTo(5)); + assertThat(p.current, equalTo(true)); + } + + [Test] + public function getPresentation_presentationNotInPresentationList_returnsNull():void + { + var p:Presentation = instance.getPresentation("invalid name"); + assertThat(p, equalTo(null)); + } + + /* PresentationList::currentPresentation tests */ + + [Test (async)] + public function currentPresentation_dispatcherPresentationChangeSignal():void + { + var p:Presentation = instance.getPresentation("presentation name 3"); + instance.presentationChangeSignal.add(presentationChangeSignalChecker); + Async.proceedOnEvent(this, dispatcher, PresentationListTestHelperEvents.PRESENTATION_CHANGE_SIGNAL, 5000); + instance.currentPresentation = p; + } + + private function presentationChangeSignalChecker():void + { + dispatcher.dispatchEvent(new PresentationListTestHelperEvents( + PresentationListTestHelperEvents.PRESENTATION_CHANGE_SIGNAL)); + } + + [Test] + public function currentPresentation_setCurrentPresentation():void + { + var p:Presentation = instance.getPresentation("presentation name 3"); + instance.currentPresentation = p; + assertThat(instance.currentPresentation, equalTo(p)); + } + + [Test] + public function currentPresentation_togglesCurrentPropertyOfOldAndNewCurrentPresentations():void + { + assertThat(instance.getPresentation("presentation name 1").current, equalTo(true)); + var p:Presentation = instance.getPresentation("presentation name 2"); + instance.currentPresentation = p; + assertThat(instance.getPresentation("presentation name 2").current, equalTo(true)); + assertThat(instance.getPresentation("presentation name 1").current, equalTo(false)); } [After] @@ -18,10 +113,10 @@ package org.bigbluebutton.model.presentation instance = null; } - [Test] +/* [Test] public function instantiated_isInstanceOfPresentationList():void { assertTrue("instance is PresentationList", instance is PresentationList); - } + }*/ } } \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/presentation/PresentationListTestHelperEvents.as b/tests/org/bigbluebutton/model/presentation/PresentationListTestHelperEvents.as new file mode 100644 index 0000000..c40c6a1 --- /dev/null +++ b/tests/org/bigbluebutton/model/presentation/PresentationListTestHelperEvents.as @@ -0,0 +1,14 @@ +package org.bigbluebutton.model.presentation +{ + import flash.events.Event; + + public class PresentationListTestHelperEvents extends Event + { + public static const PRESENTATION_CHANGE_SIGNAL:String = "PRESENTATION_CHANGE_SIGNAL"; + + public function PresentationListTestHelperEvents(type:String):void + { + super(type); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/presentation/PresentationTest.as b/tests/org/bigbluebutton/model/presentation/PresentationTest.as index ff26092..59681ed 100644 --- a/tests/org/bigbluebutton/model/presentation/PresentationTest.as +++ b/tests/org/bigbluebutton/model/presentation/PresentationTest.as @@ -1,16 +1,170 @@ package org.bigbluebutton.model.presentation { - import org.flexunit.asserts.assertTrue; + import flash.events.EventDispatcher; + + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.hamcrest.object.equalTo; public class PresentationTest { protected var instance:Presentation; + public var dispatcher:EventDispatcher = new EventDispatcher(); + [Before] public function setUp():void { - // TODO : Provide valid constructor parameters relevant to the test - instance = new Presentation("testFileName", new Function(), 1, true); + instance = new Presentation("PresentationName", fakeChangeCurrentPresentationCallback, 10, true); + + var s1:Slide = createSlide(1); + s1.current = true; + var s2:Slide = createSlide(2); + var s3:Slide = createSlide(3); + + instance.add(s1); + instance.add(s2); + instance.add(s3); + } + + /* Presentation::add tests */ + + /* The slide numbers in the messages sent to the client uses a 1-base lists, whereas the vector in which the + * slides are stored uses 0-based lists. So the index in vector should be one less than the slide number. */ + [Test] + public function add_slideAddedToSlideListWithIndexOneLessThatSlideNumber():void + { + var s4:Slide = createSlide(4); + var s5:Slide = createSlide(5); + var s6:Slide = createSlide(6); + + instance.add(s4); + instance.add(s5); + instance.add(s6); + + assertThat(instance.slides[3], equalTo(s4)); + assertThat(instance.slides[4], equalTo(s5)); + assertThat(instance.slides[5], equalTo(s6)); + } + + [Test] + public function add_slideAddedIsCurrent_currentSlideNumFieldIsSet():void + { + var s4:Slide = createSlide(4); + var s5:Slide = createSlide(5); + var s6:Slide = createSlide(6); + s5.current = true; + + instance.add(s4); + instance.add(s5); + instance.add(s6); + + assertThat(instance.currentSlideNum, equalTo(4)); /* Not 5 !! */ + } + + /* Presentation::getSlideAt tests */ + + [Test] + public function getSlideAt_returnsSlideAtThatIndex():void + { + assertThat(instance.getSlideAt(0).slideURI, equalTo("slideURI1")); + assertThat(instance.getSlideAt(1).slideURI, equalTo("slideURI2")); + assertThat(instance.getSlideAt(2).slideURI, equalTo("slideURI3")); + + var s4:Slide = createSlide(4); + instance.add(s4); + assertThat(instance.getSlideAt(3), equalTo(s4)); + } + + [Test] + public function getSlideAt_calledWithOutOfBoundsNumber_returnsNull():void + { + assertThat(instance.getSlideAt(3), equalTo(null)); + assertThat(instance.getSlideAt(100), equalTo(null)); + } + + /* Presentation::show tests */ + + [Test (async)] + public function show_dispatchesSlideChangeSignal():void + { + instance.slideChangeSignal.add(slideChangeSignalDispatchedFromShowChecker); + Async.proceedOnEvent(this, dispatcher, PresentationTestHelperEvents.SLIDE_CHANGE_SIGNAL_FROM_SHOW_CORRECT, 5000); + instance.show(); + } + + private function slideChangeSignalDispatchedFromShowChecker():void + { + dispatcher.dispatchEvent(new PresentationTestHelperEvents( + PresentationTestHelperEvents.SLIDE_CHANGE_SIGNAL_FROM_SHOW_CORRECT)); + } + + /* The callback is used to change presentations. The way the application is structured, it is a reference + * to PresentationList::changeCurrentPresentation, a wrapper for the PresentationList::currentPresentation + * setter. The reference to the function would normally be passed to the Presentation constructor by the + * PresentationList, which instantiates each Presentation. In this test, the reference passed is a reference + * to the 'fakeChangeCurrentPresentationCallback' helper defined below. */ + [Test (async)] + public function show_invokesCallBackWithSelfAsArgument():void + { + Async.proceedOnEvent(this, dispatcher, PresentationTestHelperEvents.CHANGE_PRESENTATION_CALLBACK_CALLED, 5000); + instance.show(); + } + + private function fakeChangeCurrentPresentationCallback(p:Presentation):void + { + assertThat(p, equalTo(instance)); + dispatcher.dispatchEvent(new PresentationTestHelperEvents( + PresentationTestHelperEvents.CHANGE_PRESENTATION_CALLBACK_CALLED)); + } + + /* Presentation::currentSlideNum tests */ + + [Test (async)] + public function currentSlideNum_dispatchesSlideChangeSignal():void + { + instance.slideChangeSignal.add(slideChangeSignalDispatchedFromCurrentSlideNumChecker); + Async.proceedOnEvent(this, dispatcher, + PresentationTestHelperEvents.SLIDE_CHANGE_SIGNAL_FROM_CURRENT_SLIDE_NUM_CORRECT, 5000); + + instance.currentSlideNum = 3; + } + + private function slideChangeSignalDispatchedFromCurrentSlideNumChecker():void + { + dispatcher.dispatchEvent(new PresentationTestHelperEvents( + PresentationTestHelperEvents.SLIDE_CHANGE_SIGNAL_FROM_CURRENT_SLIDE_NUM_CORRECT)); + } + + /* The slide numbers in the messages sent to the client uses a 1-base lists, whereas the vector in which the + * slides are stored uses 0-based lists. So the 'Presentation' class's field that stores this number should be + * one less than the actual slide number. */ + [Test] + public function currentSlideNum_setsCurrentSlideNumber():void + { + instance.currentSlideNum = 3; + assertThat(instance.currentSlideNum, equalTo(2)); + instance.currentSlideNum = 1; + assertThat(instance.currentSlideNum, equalTo(0)); + } + + [Test] + public function currentSlideNum_togglesCurrentPropertyOfOldAndNewCurrentSlides():void + { + instance.currentSlideNum = 3; + assertThat(instance.currentSlideNum, equalTo(2)); + + instance.currentSlideNum = 1; + /* Make sure old current slides 'current' field is set back to false: */ + assertThat(instance.getSlideAt(2).current, equalTo(false)); + } + + /* helpers */ + + private function createSlide(slideNumber:Number):Slide + { + return new Slide(slideNumber, "slideURI" + slideNumber, + "thumbURI" + slideNumber, "txtURI" + slideNumber, false); } [After] @@ -19,10 +173,10 @@ package org.bigbluebutton.model.presentation instance = null; } - [Test] +/* [Test] public function instantiated_isInstanceOfPresentation():void { assertTrue("instance is Presentation", instance is Presentation); - } + }*/ } } \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/presentation/PresentationTestHelperEvents.as b/tests/org/bigbluebutton/model/presentation/PresentationTestHelperEvents.as new file mode 100644 index 0000000..a9d9d77 --- /dev/null +++ b/tests/org/bigbluebutton/model/presentation/PresentationTestHelperEvents.as @@ -0,0 +1,16 @@ +package org.bigbluebutton.model.presentation +{ + import flash.events.Event; + + public class PresentationTestHelperEvents extends Event + { + public static const CHANGE_PRESENTATION_CALLBACK_CALLED:String = "CHANGE_PRESENTATION_CALLBACK_CALLED"; + public static const SLIDE_CHANGE_SIGNAL_FROM_SHOW_CORRECT:String = "SLIDE_CHANGE_SIGNAL_FROM_SHOW_CORRECT"; + public static const SLIDE_CHANGE_SIGNAL_FROM_CURRENT_SLIDE_NUM_CORRECT:String = "SLIDE_CHANGE_SIGNAL_FROM_CURRENT_SLIDE_NUM_CORRECT"; + + public function PresentationTestHelperEvents(type:String):void + { + super(type); + } + } +} \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/presentation/SlideTest.as b/tests/org/bigbluebutton/model/presentation/SlideTest.as index 3d55447..89fd76c 100644 --- a/tests/org/bigbluebutton/model/presentation/SlideTest.as +++ b/tests/org/bigbluebutton/model/presentation/SlideTest.as @@ -1,11 +1,18 @@ package org.bigbluebutton.model.presentation { - import org.flexunit.asserts.assertTrue; - + import flash.events.EventDispatcher; + import flash.utils.ByteArray; + + import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.hamcrest.object.equalTo; + public class SlideTest { protected var instance:Slide; + public var dispatcher:EventDispatcher = new EventDispatcher(); + [Before] public function setUp():void { @@ -13,16 +20,72 @@ package org.bigbluebutton.model.presentation instance = new Slide(1, "testSlideURI", "testThumbURI", "testTxtURI", true); } + /* Slide::data tests */ + + [Test (async)] + public function data_dispatchesSlideLoadedSignal():void + { + var b:ByteArray = new ByteArray(); + instance.slideLoadedSignal.add(slideLoadedSignalFromDataChecker); + Async.proceedOnEvent(this, dispatcher, SlideTestHelperEvents.SLIDE_LOADED_SIGNAL_CORRECT_DATA, 5000); + instance.data = b; + } + + private function slideLoadedSignalFromDataChecker():void + { + dispatcher.dispatchEvent(new SlideTestHelperEvents(SlideTestHelperEvents.SLIDE_LOADED_SIGNAL_CORRECT_DATA)); + } + + [Test] + public function data_setsLoadedToTrue():void + { + var b:ByteArray = new ByteArray(); + instance.data = b; + assertThat(instance.loaded, equalTo(true)); + } + + /* Slide::swfSource tests */ + + [Test (async)] + public function swfSource_dispatchesSlideLoadedSignal():void + { + var o:Object = new Object(); + instance.slideLoadedSignal.add(slideLoadedSignalFromSwfSourceChecker); + Async.proceedOnEvent(this, dispatcher, SlideTestHelperEvents.SLIDE_LOADED_SIGNAL_CORRECT_SWFSOURCE, 5000); + instance.swfSource = o; + } + + private function slideLoadedSignalFromSwfSourceChecker():void + { + dispatcher.dispatchEvent(new SlideTestHelperEvents(SlideTestHelperEvents.SLIDE_LOADED_SIGNAL_CORRECT_SWFSOURCE)); + } + + [Test] + public function swfSource_setsSWFFileSource():void + { + var o:Object = new Object; + instance.swfSource = o; + assertThat(instance.SWFFile.source, equalTo(o)); + } + + [Test] + public function swfSource_setsLoadedToTrue():void + { + var o:Object = new Object; + instance.swfSource = o; + assertThat(instance.loaded, equalTo(true)); + } + [After] public function tearDown():void { instance = null; } - [Test] +/* [Test] public function instantiated_isInstanceOfSlide():void { assertTrue("instance is Slide", instance is Slide); - } + }*/ } } \ No newline at end of file diff --git a/tests/org/bigbluebutton/model/presentation/SlideTestHelperEvents.as b/tests/org/bigbluebutton/model/presentation/SlideTestHelperEvents.as new file mode 100644 index 0000000..72fbaf1 --- /dev/null +++ b/tests/org/bigbluebutton/model/presentation/SlideTestHelperEvents.as @@ -0,0 +1,15 @@ +package org.bigbluebutton.model.presentation +{ + import flash.events.Event; + + public class SlideTestHelperEvents extends Event + { + public static const SLIDE_LOADED_SIGNAL_CORRECT_DATA:String = "SLIDE_LOADED_SIGNAL_CORRECT_DATA"; + public static const SLIDE_LOADED_SIGNAL_CORRECT_SWFSOURCE:String = "SLIDE_LOADED_SIGNAL_CORRECT_SWFSOURCE"; + + public function SlideTestHelperEvents(type:String):void + { + super(type); + } + } +} \ No newline at end of file From fb7d12854fd6d46929a0ef8f1ee5b43316c25c3f Mon Sep 17 00:00:00 2001 From: Adam Sharpe Date: Wed, 14 Jan 2015 14:15:50 -0500 Subject: [PATCH 10/10] Unit tests being put on hold for now... --- .../navigation/pages/chat/ChatViewMediator.as | 2 +- .../pages/chatrooms/ChatRoomsViewMediator.as | 2 +- .../command/ConnectCommandTest.as | 8 +- .../pages/chat/ChatViewMediatorTest.as | 124 ++++++++++++++---- .../chatrooms/ChatRoomsViewMediatorTest.as | 74 +++++++---- 5 files changed, 156 insertions(+), 54 deletions(-) diff --git a/src/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediator.as index 3a7e36a..b8d3c0e 100644 --- a/src/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediator.as @@ -55,7 +55,7 @@ package org.bigbluebutton.view.navigation.pages.chat override public function initialize():void { - Log.getLogger("org.bigbluebutton").info(String(this)); + trace("ChatViewMediator::initialize"); data = userUISession.currentPageDetails; diff --git a/src/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediator.as index 2851d1c..921263a 100644 --- a/src/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediator.as @@ -58,7 +58,7 @@ package org.bigbluebutton.view.navigation.pages.chatrooms override public function initialize():void { - Log.getLogger("org.bigbluebutton").info(String(this)); + trace("ChatRoomsViewMediator::initialize"); dicUsertoChat = new Dictionary(); diff --git a/tests/org/bigbluebutton/command/ConnectCommandTest.as b/tests/org/bigbluebutton/command/ConnectCommandTest.as index 482b3e8..2649c7b 100644 --- a/tests/org/bigbluebutton/command/ConnectCommandTest.as +++ b/tests/org/bigbluebutton/command/ConnectCommandTest.as @@ -9,6 +9,7 @@ package org.bigbluebutton.command import mockolate.nice; import mockolate.prepare; import mockolate.received; + import mockolate.record; import mockolate.runner.MockolateRule; import mockolate.strict; import mockolate.stub; @@ -102,7 +103,7 @@ package org.bigbluebutton.command protected var instance:ConnectCommand; - [Before] + [Before (async)] public function setUp():void { instance = new ConnectCommand(); @@ -189,14 +190,13 @@ package org.bigbluebutton.command instance.execute(); } - /* This only 'sometimes' works... there is stuff I'm still not understanding about Mockolate (and resources are sparce...). */ [Test] public function execute_successJoined_connectInvokedOnVideoAndDeskshareConnection():void { stub(mockConnection).method("connect").args(mockConferenceParameters).calls(mockSuccessConnected.dispatch); stub(mockUsersService).method("sendJoinMeetingMessage").calls(mockSuccessJoiningMeetingSignal.dispatch); - expect(mockVideoConnection.connect).once(); - expect(mockDeskshareConnection.connect).once(); + expect(mockVideoConnection.connect()); + expect(mockDeskshareConnection.connect()); instance.execute(); } diff --git a/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediatorTest.as index 0cadb6f..28e0baf 100644 --- a/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediatorTest.as +++ b/tests/org/bigbluebutton/view/navigation/pages/chat/ChatViewMediatorTest.as @@ -2,82 +2,156 @@ package org.bigbluebutton.view.navigation.pages.chat { import flash.events.Event; + import mockolate.expect; + import mockolate.mock; import mockolate.prepare; import mockolate.runner.MockolateRule; import mockolate.stub; + import mx.events.FlexEvent; + import org.bigbluebutton.core.ChatMessageService; + import org.bigbluebutton.model.User; import org.bigbluebutton.model.UserList; import org.bigbluebutton.model.UserSession; import org.bigbluebutton.model.UserUISession; + import org.bigbluebutton.model.chat.ChatMessages; import org.bigbluebutton.model.chat.ChatMessagesSession; + import org.bigbluebutton.model.chat.PrivateChatMessage; import org.flexunit.asserts.assertTrue; import org.flexunit.asserts.fail; import org.flexunit.async.Async; + import org.hamcrest.assertThat; + import org.hamcrest.object.equalTo; import org.osflash.signals.Signal; import robotlegs.bender.bundles.mvcs.Mediator; import spark.components.Button; + import spark.components.Label; import spark.components.List; + import spark.components.TextInput; public class ChatViewMediatorTest { [Rule] public var mockolateRule:MockolateRule = new MockolateRule(); + protected var instance:ChatViewMediator; + + + /* Mocked fields */ + [Mock] - public var view:ChatView; + public var mockView:ChatView; [Mock] - public var chatMessageService:ChatMessageService; + public var mockChatMessageService:ChatMessageService; [Mock] - public var userSession:UserSession; + public var mockUserSession:UserSession; [Mock] - public var userUISession:UserUISession; + public var mockUserUISession:UserUISession; [Mock] - public var chatMessagesSession:ChatMessagesSession; + public var mockChatMessagesSession:ChatMessagesSession; + + + /* Other dependencies */ [Mock] - public var list:List; + public var mockList:List; [Mock] - public var sendButton:Button; + public var mockSendButton:Button; [Mock] - public var sendMessageOnSuccessSignal:Signal; + public var mockUserList:UserList; [Mock] - public var sendMessageOnFailureSignal:Signal; + public var mockPageName:Label; [Mock] - public var userList:UserList; + public var mockInputMessage:TextInput; [Mock] - public var userRemovedSignal:Signal; + public var mockPrivateChat:PrivateChatMessage; [Mock] - public var userAddedSignal:Signal + public var mockChatMessages:ChatMessages; - private static var TIMEOUT:Number = 5000; - protected var instance:ChatViewMediator; + /* Signals */ + + public var mockSendMessageOnSuccessSignal:Signal = new Signal(); - [Before(async)] + public var mockSendMessageOnFailureSignal:Signal = new Signal(); + + public var mockUserRemovedSignal:Signal = new Signal(); + + public var mockUserAddedSignal:Signal = new Signal(); + + [Before] public function setUp():void { - Async.proceedOnEvent(this, prepare(ChatView, ChatMessageService, UserSession, UserUISession, ChatMessagesSession, List, Button, Signal), Event.COMPLETE, TIMEOUT, timeoutHandler) instance = new ChatViewMediator(); - instance.chatMessageService = this.chatMessageService; - instance.chatMessagesSession = this.chatMessagesSession; - instance.userSession = this.userSession; - instance.userUISession = this.userUISession; - instance.view = this.view; - instance.list = this.list; + /* Set up all of the mocked fields: */ + + instance.chatMessageService = mockChatMessageService; + instance.chatMessagesSession = mockChatMessagesSession; + instance.userSession = mockUserSession; + instance.userUISession = mockUserUISession; + instance.view = mockView; + + /* String all of the other dependencies together: */ + + stub(instance.chatMessageService).getter("sendMessageOnSuccessSignal").returns(mockSendMessageOnSuccessSignal); + stub(instance.chatMessageService).getter("sendMessageOnFailureSignal").returns(mockSendMessageOnFailureSignal); + + stub(instance.userSession).getter("userList").returns(mockUserList); + stub(mockUserList).getter("userRemovedSignal").returns(mockUserRemovedSignal); + stub(mockUserList).getter("userAddedSignal").returns(mockUserAddedSignal); + + stub(mockChatMessagesSession).method("getPrivateMessages").anyArgs().returns(mockPrivateChat); + stub(mockPrivateChat).getter("privateChat").returns(mockChatMessages); + + stub(mockView).getter("list").returns(mockList); + stub(mockView).getter("inputMessage").returns(mockInputMessage); + stub(mockView).getter("sendButton").returns(mockSendButton); + stub(mockView).getter("pageName").returns(mockPageName); + + // mock(mockList).asEventDispatcher(); + // mock(mockSendButton).asEventDispatcher(); + stub(mockList).asEventDispatcher(); + stub(mockSendButton).asEventDispatcher(); + } + + [Test] + public function initialize_currentPageDetailsIsUser_createNewPrivateChat():void + { + var user:User = new User(); + user.name = "User name"; + + stub(mockUserUISession).getter("currentPageDetails").returns(user); + instance.initialize(); + } + + /* The 'currentPageDetails' object, when it is not a user should contain at least 5 fields. They are: + * publicChat, user, name, chatMessages, online. 'online' only applies to private chat. */ + + [Test] + public function initialize_currentPageDetailsIsPublicChat_opensPublicChatMessages():void + { + var cpd:Object = new Object(); + cpd.publicChat = true; + cpd.user = new User(); + cpd.name = "Mock Chat Name"; + cpd.chatMessages = new ChatMessages(); + + stub(mockUserUISession).getter("currentPageDetails").returns(cpd); + instance.initialize(); } [After] @@ -86,7 +160,9 @@ package org.bigbluebutton.view.navigation.pages.chat instance = null; } - [Test] + + +/* [Test] public function instantiated_isInstanceOfChatViewMediator():void { assertTrue("instance is ChatViewMediator", instance is ChatViewMediator); @@ -119,6 +195,6 @@ package org.bigbluebutton.view.navigation.pages.chat protected function timeoutHandler(passThroughData:Object):void { fail("Timeout occured during setUp() method"); - } + }*/ } } \ No newline at end of file diff --git a/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediatorTest.as b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediatorTest.as index eb95550..dd023d8 100644 --- a/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediatorTest.as +++ b/tests/org/bigbluebutton/view/navigation/pages/chatrooms/ChatRoomsViewMediatorTest.as @@ -30,51 +30,77 @@ package org.bigbluebutton.view.navigation.pages.chatrooms [Rule] public var mockolateRule:MockolateRule = new MockolateRule(); - [Mock] - public var view:ChatRoomsView; + protected var instance:ChatRoomsViewMediator; + - [Mock] - public var userSession:UserSession; + /* Mocked fields */ [Mock] - public var userUISession:UserUISession; + public var mockView:ChatRoomsView; [Mock] - public var chatMessagesSession:ChatMessagesSession; + public var mockUserSession:UserSession; [Mock] - public var list:List; + public var mockChatMessagesSession:ChatMessagesSession; [Mock] - public var userList:UserList; + public var mockUserUISession:UserUISession; + + + /* Other dependencies */ [Mock] - public var userRemovedSignal:Signal; + public var mockPublicChat:ChatMessages; [Mock] - public var userAddedSignal:Signal + public var mockList:List; [Mock] - public var publicChat:ChatMessages; + public var mockUserList:UserList; - [Mock] - public var chatMessageChangeSignal:Signal; - private static var TIMEOUT:Number = 5000; + /* Signals */ - protected var instance:ChatRoomsViewMediator; + public var mockChatMessageChangeSignal:Signal = new Signal(); - [Before(async)] + public var publicChat_mockChatMessageChangeSignal:Signal = new Signal(); + + public var mockUserRemovedSignal:Signal = new Signal(); + + public var mockUserAddedSignal:Signal = new Signal(); + + + [Before] public function setUp():void { - Async.proceedOnEvent(this, prepare(ChatRoomsView, UserSession, UserUISession, ChatMessagesSession, Signal, ChatMessages, List, UserList), Event.COMPLETE, TIMEOUT, timeoutHandler) instance = new ChatRoomsViewMediator(); - instance.chatMessagesSession = this.chatMessagesSession; - instance.userSession = this.userSession; - instance.userUISession = this.userUISession; - instance.view = this.view; - instance.list = this.list + /* Set up all of the mocked fields: */ + + instance.chatMessagesSession = mockChatMessagesSession; + instance.userSession = mockUserSession; + instance.userUISession = mockUserUISession; + instance.view = mockView; + + /* String all of the other dependencies together: */ + + stub(mockUserSession).getter("userList").returns(mockUserList); + stub(mockUserList).getter("userAddedSignal").returns(mockUserAddedSignal); + stub(mockUserList).getter("userRemovedSignal").returns(mockUserRemovedSignal); + + stub(mockChatMessagesSession).getter("chatMessageChangeSignal").returns(mockChatMessageChangeSignal); + stub(mockChatMessagesSession).getter("publicChat").returns(mockPublicChat); + stub(mockPublicChat).getter("chatMessageChangeSignal").returns(publicChat_mockChatMessageChangeSignal); + + stub(mockView).getter("list").returns(mockList); + stub(mockList).asEventDispatcher(); + } + + [Test] + public function initialize():void + { + } [After] @@ -83,7 +109,7 @@ package org.bigbluebutton.view.navigation.pages.chatrooms instance = null; } - [Test] +/* [Test] public function instantiated_isInstanceOfChatRoomsViewMediator():void { assertTrue("instance is ChatRoomsViewMediator", instance is ChatRoomsViewMediator); @@ -116,6 +142,6 @@ package org.bigbluebutton.view.navigation.pages.chatrooms protected function timeoutHandler(passThroughData:Object):void { fail("Timeout occured during setUp() method"); - } + }*/ } }