Mini Kabibi Habibi
Imports Microsoft.VisualBasic
Imports DevExpress.Xpf.DemoBase.DemoTesting
Imports System.Threading
Imports System.Windows.Threading
Imports DevExpress.Xpf.Core.Native
Imports System
Imports DevExpress.Xpf.NavBar
Imports System.Collections
Imports System.Windows.Controls
Imports System.Windows
Imports System.Windows.Input
Imports DevExpress.Xpf.Editors
Imports System.Windows.Controls.Primitives
Imports System.Windows.Media.Animation
Imports DevExpress.Xpf.Core
Namespace NavBarDemo.Tests
Public Class NavBarCheckAllDemosFixture
Inherits CheckAllDemosFixture
Private skipMemoryLeaksCheckModules() As Type = { }
Protected Overrides Function CheckMemoryLeaks(ByVal moduleType As Type) As Boolean
Return Not EnumeratorHelper.Exists(Of Type)(skipMemoryLeaksCheckModules, moduleType)
End Function
Protected Overrides Sub CreateSwitchAllThemesActions()
MyBase.CreateSwitchAllThemesActions()
End Sub
End Class
#Region "NavBarDemoModulesAccessor"
Public Class NavBarDemoModulesAccessor
Inherits DemoModulesAccessor(Of NavBarDemoModule)
Public Sub New(ByVal fixture As BaseDemoTestingFixture)
MyBase.New(fixture)
End Sub
Public ReadOnly Property NavBarControl() As NavBarControl
Get
Return DemoModule.navBarControl
End Get
End Property
Public ReadOnly Property View() As NavBarViewBase
Get
Return NavBarControl.View
End Get
End Property
Public ReadOnly Property ExplorerBarView() As ExplorerBarView
Get
Return CType(View, ExplorerBarView)
End Get
End Property
Public ReadOnly Property NavigationPaneView() As NavigationPaneView
Get
Return CType(View, NavigationPaneView)
End Get
End Property
Public ReadOnly Property SideBarView() As SideBarView
Get
Return CType(View, SideBarView)
End Get
End Property
Public ReadOnly Property GroupsAndItemsModule() As GroupsAndItems
Get
Return CType(DemoModule, GroupsAndItems)
End Get
End Property
End Class
#End Region
Public MustInherit Class BaseNavBarTestingFixture
Inherits BaseDemoTestingFixture
Private ReadOnly modulesAccessor As NavBarDemoModulesAccessor
Public Sub New()
modulesAccessor = New NavBarDemoModulesAccessor(Me)
End Sub
Public ReadOnly Property NavBarControl() As NavBarControl
Get
Return modulesAccessor.NavBarControl
End Get
End Property
Public ReadOnly Property View() As NavBarViewBase
Get
Return modulesAccessor.View
End Get
End Property
Public ReadOnly Property ExplorerBarView() As ExplorerBarView
Get
Return modulesAccessor.ExplorerBarView
End Get
End Property
Public ReadOnly Property NavigationPaneView() As NavigationPaneView
Get
Return modulesAccessor.NavigationPaneView
End Get
End Property
Public ReadOnly Property SideBarView() As SideBarView
Get
Return modulesAccessor.SideBarView
End Get
End Property
Public ReadOnly Property GroupsAndItemsModule() As GroupsAndItems
Get
Return CType(DemoBaseTesting.CurrentDemoModule, GroupsAndItems)
End Get
End Property
Public ReadOnly Property Events() As Events
Get
Return CType(DemoBaseTesting.CurrentDemoModule, Events)
End Get
End Property
End Class
Public Class CheckDemoOptionsFixture
Inherits BaseNavBarTestingFixture
Protected Overrides Sub CreateActions()
MyBase.CreateActions()
AddSimpleAction(AddressOf CreateCheckDemosActions)
End Sub
Private Sub CreateCheckDemosActions()
CreateCheckTableViewDemoActions()
CreateCheckLayoutCustomizationDemoActions()
CreateEventsDemoActions()
CreateSetCurrentDemoActions(Nothing, False)
End Sub
#Region "GroupsAndItems"
Private Sub CreateCheckTableViewDemoActions()
AddLoadModuleActions(GetType(GroupsAndItems))
AddSimpleAction(Function() AnonymousMethod1())
End Sub
Private Function AnonymousMethod1() As Boolean
Assert.AreEqual(0, GroupsAndItemsModule.viewsList.SelectedIndex)
AssertGroupsAndItemsModuleView(GetType(ExplorerBarView))
GroupsAndItemsModule.viewsList.SelectedIndex = 1
UpdateLayoutAndDoEvents()
AssertGroupsAndItemsModuleView(GetType(NavigationPaneView))
GroupsAndItemsModule.viewsList.SelectedIndex = 2
UpdateLayoutAndDoEvents()
AssertGroupsAndItemsModuleView(GetType(SideBarView))
Return True
End Function
Private Sub AssertGroupsAndItemsModuleView(ByVal viewType As Type)
Dim images As ArrayList = (CType(GroupsAndItemsModule.FindResource("Images"), ArrayList))
Assert.AreEqual(viewType, View.GetType())
Assert.IsTrue(GroupsAndItemsModule.addGroupButton.IsEnabled)
Assert.IsTrue(GroupsAndItemsModule.deleteLastGroupButton.IsEnabled)
Assert.IsTrue(GroupsAndItemsModule.addNewItemButton.IsEnabled)
Assert.IsFalse(GroupsAndItemsModule.deleteSelectedItemButton.IsEnabled)
Assert.AreEqual(0, GroupsAndItemsModule.newGroupImageStyleList.SelectedIndex)
Assert.AreEqual(0, GroupsAndItemsModule.newItemImageList.SelectedIndex)
Assert.AreEqual(2, NavBarControl.Groups.Count)
Assert.AreEqual("Group 1", NavBarControl.Groups(0).Header)
Assert.AreEqual(1, NavBarControl.Groups(0).Items.Count)
Assert.AreEqual("Item 1", (CType(NavBarControl.Groups(0).Items(0), NavBarItem)).Content)
Assert.AreEqual("Group 2", NavBarControl.Groups(1).Header)
Assert.AreEqual(1, NavBarControl.Groups(1).Items.Count)
Assert.AreEqual("Item 1", (CType(NavBarControl.Groups(1).Items(0), NavBarItem)).Content)
UIAutomationActions.ClickButton(GroupsAndItemsModule.addGroupButton)
UpdateLayoutAndDoEvents()
Assert.AreEqual(3, NavBarControl.Groups.Count)
Assert.AreEqual("Group 3", NavBarControl.Groups(2).Header)
Assert.AreEqual(0, NavBarControl.Groups(2).Items.Count)
Assert.AreEqual((CType(images(0), Image)).Source, NavBarControl.Groups(2).ImageSource)
Assert.AreEqual(16R, NavBarControl.Groups(2).ItemImageSettings.Height)
Assert.AreEqual(16R, NavBarControl.Groups(2).ItemImageSettings.Width)
GroupsAndItemsModule.newItemImageList.SelectedIndex = 1
GroupsAndItemsModule.newGroupImageStyleList.SelectedIndex = 1
UpdateLayoutAndDoEvents()
UIAutomationActions.ClickButton(GroupsAndItemsModule.addGroupButton)
UpdateLayoutAndDoEvents()
Assert.AreEqual(4, NavBarControl.Groups.Count)
Assert.AreEqual("Group 4", NavBarControl.Groups(3).Header)
Assert.AreEqual(0, NavBarControl.Groups(3).Items.Count)
Assert.AreEqual((CType(images(1), Image)).Source, NavBarControl.Groups(3).ImageSource)
Assert.AreEqual(32R, NavBarControl.Groups(3).ItemImageSettings.Height)
Assert.AreEqual(32R, NavBarControl.Groups(3).ItemImageSettings.Width)
Assert.AreEqual(System.Windows.HorizontalAlignment.Center, NavBarControl.Groups(3).ItemLayoutSettings.ImageHorizontalAlignment)
Assert.AreEqual(System.Windows.HorizontalAlignment.Center, NavBarControl.Groups(3).ItemLayoutSettings.TextHorizontalAlignment)
Assert.AreEqual(Dock.Top, NavBarControl.Groups(3).ItemLayoutSettings.ImageDocking)
Assert.IsTrue(GroupsAndItemsModule.addGroupButton.IsEnabled)
Assert.IsTrue(GroupsAndItemsModule.deleteLastGroupButton.IsEnabled)
Assert.IsTrue(GroupsAndItemsModule.addNewItemButton.IsEnabled)
Assert.IsFalse(GroupsAndItemsModule.deleteSelectedItemButton.IsEnabled)
NavBarControl.ActiveGroup = NavBarControl.Groups(2)
UpdateLayoutAndDoEvents()
UIAutomationActions.ClickButton(GroupsAndItemsModule.addNewItemButton)
UpdateLayoutAndDoEvents()
Assert.AreEqual(1, NavBarControl.Groups(2).Items.Count)
Assert.AreEqual("Item 1", (CType(NavBarControl.Groups(2).Items(0), NavBarItem)).Content)
Assert.AreEqual((CType(images(1), Image)).Source, (CType(NavBarControl.Groups(2).Items(0), NavBarItem)).ImageSource)
GroupsAndItemsModule.newItemImageList.SelectedIndex = 2
UpdateLayoutAndDoEvents()
UIAutomationActions.ClickButton(GroupsAndItemsModule.addNewItemButton)
UpdateLayoutAndDoEvents()
Assert.AreEqual(2, NavBarControl.Groups(2).Items.Count)
Assert.AreEqual("Item 2", (CType(NavBarControl.Groups(2).Items(1), NavBarItem)).Content)
Assert.AreEqual((CType(images(2), Image)).Source, (CType(NavBarControl.Groups(2).Items(1), NavBarItem)).ImageSource)
Assert.IsTrue(GroupsAndItemsModule.addGroupButton.IsEnabled)
Assert.IsTrue(GroupsAndItemsModule.deleteLastGroupButton.IsEnabled)
Assert.IsTrue(GroupsAndItemsModule.addNewItemButton.IsEnabled)
Assert.IsFalse(GroupsAndItemsModule.deleteSelectedItemButton.IsEnabled)
NavBarControl.ActiveGroup.SelectedItem = CType(NavBarControl.Groups(2).Items(1), NavBarItem)
UpdateLayoutAndDoEvents()
Assert.IsTrue(GroupsAndItemsModule.addGroupButton.IsEnabled)
Assert.IsTrue(GroupsAndItemsModule.deleteLastGroupButton.IsEnabled)
Assert.IsTrue(GroupsAndItemsModule.addNewItemButton.IsEnabled)
Assert.IsTrue(GroupsAndItemsModule.deleteSelectedItemButton.IsEnabled)
UIAutomationActions.ClickButton(GroupsAndItemsModule.deleteSelectedItemButton)
UpdateLayoutAndDoEvents()
Assert.IsFalse(GroupsAndItemsModule.deleteSelectedItemButton.IsEnabled)
Assert.AreEqual(1, NavBarControl.Groups(2).Items.Count)
Assert.AreEqual("Item 1", (CType(NavBarControl.Groups(2).Items(0), NavBarItem)).Content)
NavBarControl.ActiveGroup.SelectedItem = CType(NavBarControl.Groups(2).Items(0), NavBarItem)
UpdateLayoutAndDoEvents()
Assert.IsTrue(GroupsAndItemsModule.deleteSelectedItemButton.IsEnabled)
UIAutomationActions.ClickButton(GroupsAndItemsModule.deleteSelectedItemButton)
UpdateLayoutAndDoEvents()
Assert.AreEqual(0, NavBarControl.Groups(2).Items.Count)
Assert.IsTrue(GroupsAndItemsModule.deleteLastGroupButton.IsEnabled)
Assert.IsFalse(GroupsAndItemsModule.deleteSelectedItemButton.IsEnabled)
UIAutomationActions.ClickButton(GroupsAndItemsModule.deleteLastGroupButton)
UpdateLayoutAndDoEvents()
Assert.AreEqual(3, NavBarControl.Groups.Count)
Assert.AreEqual("Group 3", NavBarControl.Groups(2).Header)
Assert.IsTrue(GroupsAndItemsModule.deleteLastGroupButton.IsEnabled)
Assert.IsFalse(GroupsAndItemsModule.deleteSelectedItemButton.IsEnabled)
UIAutomationActions.ClickButton(GroupsAndItemsModule.deleteLastGroupButton)
UpdateLayoutAndDoEvents()
Assert.AreEqual(2, NavBarControl.Groups.Count)
Assert.AreEqual("Group 2", NavBarControl.Groups(1).Header)
Assert.IsTrue(GroupsAndItemsModule.deleteLastGroupButton.IsEnabled)
Assert.IsFalse(GroupsAndItemsModule.deleteSelectedItemButton.IsEnabled)
UIAutomationActions.ClickButton(GroupsAndItemsModule.deleteLastGroupButton)
UpdateLayoutAndDoEvents()
Assert.AreEqual(1, NavBarControl.Groups.Count)
Assert.AreEqual("Group 1", NavBarControl.Groups(0).Header)
Assert.IsFalse(GroupsAndItemsModule.deleteLastGroupButton.IsEnabled)
Assert.IsFalse(GroupsAndItemsModule.deleteSelectedItemButton.IsEnabled)
NavBarControl.Groups.RemoveAt(0)
GroupsAndItemsModule.newGroupImageStyleList.SelectedIndex = 0
GroupsAndItemsModule.newItemImageList.SelectedIndex = 0
UpdateLayoutAndDoEvents()
UIAutomationActions.ClickButton(GroupsAndItemsModule.addGroupButton)
UpdateLayoutAndDoEvents()
NavBarControl.ActiveGroup = NavBarControl.Groups(0)
UpdateLayoutAndDoEvents()
UIAutomationActions.ClickButton(GroupsAndItemsModule.addNewItemButton)
UpdateLayoutAndDoEvents()
UIAutomationActions.ClickButton(GroupsAndItemsModule.addGroupButton)
UpdateLayoutAndDoEvents()
NavBarControl.ActiveGroup = NavBarControl.Groups(1)
UpdateLayoutAndDoEvents()
UIAutomationActions.ClickButton(GroupsAndItemsModule.addNewItemButton)
UpdateLayoutAndDoEvents()
End Sub
#End Region
Private Sub CreateCheckLayoutCustomizationDemoActions()
AddLoadModuleActions(GetType(LayoutCustomization))
End Sub
Private Sub CreateEventsDemoActions()
AddLoadModuleActions(GetType(Events))
AddSimpleAction(AddressOf ClearEventCheckBoxes)
AddCheckCommonEventsActions()
AddCheckExplorerBarGroupExpandedEventsActions()
AddSimpleAction(Function() AnonymousMethod2())
AddCheckCommonEventsActions()
AddCheckNavigationPaneExpandedEventsActions()
AddSimpleAction(Function() AnonymousMethod3())
AddCheckCommonEventsActions()
AddSimpleAction(Function() AnonymousMethod4())
AddCheckCommonEventsActions()
AddCheckExplorerBarGroupExpandedEventsActions()
End Sub
Private Function AnonymousMethod2() As Boolean
Events.viewsList.SelectedIndex = 1
UpdateLayoutAndDoEvents()
Return True
End Function
Private Function AnonymousMethod3() As Boolean
Events.viewsList.SelectedIndex = 2
UpdateLayoutAndDoEvents()
Return True
End Function
Private Function AnonymousMethod4() As Boolean
Events.viewsList.SelectedIndex = 0
UpdateLayoutAndDoEvents()
Return True
End Function
Private Sub AddCheckCommonEventsActions()
Dim collapsingStoryboard As Storyboard = CreateDXExpanderAnimation(0)
Dim expandingStoryboard As Storyboard = CreateDXExpanderAnimation(1)
AddSimpleAction(Function() AnonymousMethod5())
AddSimpleAction(Function() AnonymousMethod6())
AddSimpleAction(Function() AnonymousMethod7())
AddSimpleAction(Function() AnonymousMethod8())
AddSimpleAction(Function() AnonymousMethod9())
AddSimpleAction(Function() AnonymousMethod10())
AddWaitUntilAnimationInProgress()
AddSimpleAction(Function() AnonymousMethod11(collapsingStoryboard, expandingStoryboard))
AddWaitUntilAnimationInProgress()
AddSimpleAction(Function() AnonymousMethod12(collapsingStoryboard, expandingStoryboard))
AddWaitUntilAnimationInProgress()
End Sub
Private Function AnonymousMethod5() As Boolean
ToggleCheckEditAndRaiseEvent(Events.mouseDownCheckbox, "MouseDown", New MouseButtonEventArgs(Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left) With {.RoutedEvent = UIElement.PreviewMouseDownEvent})
Return True
End Function
Private Function AnonymousMethod6() As Boolean
ToggleCheckEditAndRaiseEvent(Events.mouseMoveCheckbox, "MouseMove", New MouseEventArgs(Mouse.PrimaryDevice, Environment.TickCount) With {.RoutedEvent = UIElement.MouseMoveEvent})
Return True
End Function
Private Function AnonymousMethod7() As Boolean
ToggleCheckEditAndRaiseEvent(Events.mouseUpCheckbox, "MouseUp", New MouseButtonEventArgs(Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left) With {.RoutedEvent = UIElement.PreviewMouseUpEvent})
Return True
End Function
Private Function AnonymousMethod8() As Boolean
ToggleCheckEditAndRaiseEvent(Events.clickCheckbox, "Click", New MouseEventArgs(Mouse.PrimaryDevice, Environment.TickCount) With {.RoutedEvent = ButtonBase.ClickEvent})
Return True
End Function
Private Function AnonymousMethod9() As Boolean
ToggleCheckEditAndPerformAction(Events.selectionChangingCheckbox, "ItemSelecting", AddressOf SelectFirstItem, AddressOf SelectSecondItem)
Return True
End Function
Private Function AnonymousMethod10() As Boolean
ToggleCheckEditAndPerformAction(Events.selectionChangedCheckbox, "ItemSelected", AddressOf SelectFirstItem, AddressOf SelectSecondItem)
Return True
End Function
Private Function AnonymousMethod11(ByVal collapsingStoryboard As Storyboard, ByVal expandingStoryboard As Storyboard) As Boolean
NavBarAnimationOptions.SetCollapseStoryboard(Me.NavBarControl.View, collapsingStoryboard)
NavBarAnimationOptions.SetExpandStoryboard(Me.NavBarControl.View, expandingStoryboard)
ToggleCheckEditAndPerformAction(Events.activeGroupChangingCheckbox, "ActiveGroupChanging", AddressOf SelectSecondGroup, AddressOf SelectFirstGroup)
Return True
End Function
Private Function AnonymousMethod12(ByVal collapsingStoryboard As Storyboard, ByVal expandingStoryboard As Storyboard) As Boolean
NavBarAnimationOptions.SetCollapseStoryboard(Me.NavBarControl.View, collapsingStoryboard)
NavBarAnimationOptions.SetExpandStoryboard(Me.NavBarControl.View, expandingStoryboard)
ToggleCheckEditAndPerformAction(Events.activeGroupChangedCheckbox, "ActiveGroupChanged", AddressOf SelectSecondGroup, AddressOf SelectFirstGroup)
Return True
End Function
Private Sub SelectSecondGroup()
Events.navBar.ActiveGroup = Events.navBar.Groups(1)
End Sub
Private Sub SelectFirstGroup()
Events.navBar.ActiveGroup = Events.navBar.Groups(0)
End Sub
Private Sub SelectFirstItem()
Events.navBar.ActiveGroup.SelectedItemIndex = 0
End Sub
Private Sub SelectSecondItem()
Events.navBar.ActiveGroup.SelectedItemIndex = 2
End Sub
Private Sub AddWaitUntilAnimationInProgress()
AddConditionAction(AddressOf WaitUntilAnimationInProgressCondition, Nothing)
End Sub
Private Function WaitUntilAnimationInProgressCondition() As Boolean
For Each group As NavBarGroup In Events.navBar.Groups
If group.IsExpanding OrElse group.IsCollapsing Then
Return False
End If
Next group
Return True
End Function
Private Sub AddCheckExplorerBarGroupExpandedEventsActions()
AddSimpleAction(Function() AnonymousMethod13())
AddSimpleAction(Function() AnonymousMethod14())
End Sub
Private Function AnonymousMethod13() As Boolean
ToggleCheckEditAndPerformAction(Events.groupExpandedChangingCheckbox, "GroupExpandedChanging", Function() AnonymousMethod15())
Return True
End Function
Private Function AnonymousMethod15() As Boolean
Events.navBar.ActiveGroup.IsExpanded = Not Events.navBar.ActiveGroup.IsExpanded
Return True
End Function
Private Function AnonymousMethod14() As Boolean
ToggleCheckEditAndPerformAction(Events.groupExpandedChangedCheckbox, "GroupExpandedChanged", Function() AnonymousMethod16())
Return True
End Function
Private Function AnonymousMethod16() As Boolean
Events.navBar.ActiveGroup.IsExpanded = Not Events.navBar.ActiveGroup.IsExpanded
Return True
End Function
Private Function CreateDXExpanderAnimation(ByVal toValue As Double) As Storyboard
Dim stb As New Storyboard()
Dim da As New DoubleAnimation(toValue, New Duration())
Storyboard.SetTargetName(da, "PART_DXExpander")
Storyboard.SetTargetProperty(da, New PropertyPath(DXExpander.AnimationProgressProperty))
Return stb
End Function
Private Sub AddCheckNavigationPaneExpandedEventsActions()
AddSimpleAction(Function() AnonymousMethod17())
AddSimpleAction(Function() AnonymousMethod18())
End Sub
Private Function AnonymousMethod17() As Boolean
ToggleCheckEditAndPerformAction(Events.navPaneExpandedChangingCheckbox, "NavPaneExpandedChanging", Function() AnonymousMethod19())
Return True
End Function
Private Function AnonymousMethod19() As Boolean
CType(Events.navBar.View, NavigationPaneView).IsExpanded = Not(CType(Events.navBar.View, NavigationPaneView)).IsExpanded
Return True
End Function
Private Function AnonymousMethod18() As Boolean
ToggleCheckEditAndPerformAction(Events.navPaneExpandedChangedCheckbox, "NavPaneExpandedChanged", Function() AnonymousMethod20())
Return True
End Function
Private Function AnonymousMethod20() As Boolean
CType(Events.navBar.View, NavigationPaneView).IsExpanded = Not(CType(Events.navBar.View, NavigationPaneView)).IsExpanded
Return True
End Function
Private Sub ClearEventCheckBoxes()
Events.mouseDownCheckbox.IsChecked = False
Events.mouseMoveCheckbox.IsChecked = False
Events.mouseUpCheckbox.IsChecked = False
Events.clickCheckbox.IsChecked = False
Events.selectionChangingCheckbox.IsChecked = False
Events.selectionChangedCheckbox.IsChecked = False
Events.activeGroupChangingCheckbox.IsChecked = False
Events.activeGroupChangedCheckbox.IsChecked = False
Events.groupExpandedChangingCheckbox.IsChecked = False
Events.groupExpandedChangedCheckbox.IsChecked = False
Events.navPaneExpandedChangingCheckbox.IsChecked = False
Events.navPaneExpandedChangedCheckbox.IsChecked = False
End Sub
Private Sub ToggleCheckEditAndPerformAction(ByVal checkEdit As CheckEdit, ByVal message As String, ByVal action As Action)
ToggleCheckEditAndPerformAction(checkEdit, message, action, Function() AnonymousMethod21())
End Sub
Private Function AnonymousMethod21() As Boolean
Return True
End Function
Private Sub ToggleCheckEditAndRaiseEvent(ByVal checkEdit As CheckEdit, ByVal message As String, ByVal eventArgs As RoutedEventArgs)
Dim item As FrameworkElement = HelperActions.FindElementByType(Of NavBarItemControl)(Events.navBar)
ToggleCheckEditAndPerformAction(checkEdit, message, Function() AnonymousMethod22(eventArgs, item))
End Sub
Private Function AnonymousMethod22(ByVal eventArgs As RoutedEventArgs, ByVal item As FrameworkElement) As Boolean
item.RaiseEvent(eventArgs)
Return True
End Function
Private Sub ToggleCheckEditAndPerformAction(ByVal checkEdit As CheckEdit, ByVal message As String, ByVal action As Action, ByVal rollBack As Action)
action()
UpdateLayoutAndDoEvents()
Assert.AreEqual(String.Empty, Events.textBox.Text)
rollBack()
UpdateLayoutAndDoEvents()
checkEdit.IsChecked = True
action()
UpdateLayoutAndDoEvents()
Assert.IsTrue(Events.textBox.Text.Contains(message))
rollBack()
UIAutomationActions.ClickButton(Events.clearButton)
checkEdit.IsChecked = False
UpdateLayoutAndDoEvents()
End Sub
End Class
End Namespace