From 192f7fccd4c82a11bbb467139a23d1b52374233c Mon Sep 17 00:00:00 2001 From: Alan Ren Date: Tue, 19 Oct 2021 09:54:57 -0700 Subject: [PATCH] handle add column request (#1272) * handle add column request * comments * rename data to ViewModel --- .../Hosting/Protocol/MessageDispatcher.cs | 12 +++- .../TableDesigner/Constants.cs | 31 ++++++++++ .../Components/ComponentPropertiesBase.cs | 7 +-- .../Components/DropdownProperties.cs | 4 +- .../Contracts/Components/TableProperties.cs | 37 ++++++++++- .../ProcessTableDesignerEditRequest.cs | 4 +- .../Requests/SaveTableChangesRequest.cs | 2 +- .../Contracts/TableChangeInfo.cs | 34 ++++++++++ .../TableDesigner/Contracts/TableColumn.cs | 25 -------- .../TableDesigner/Contracts/TableDataModel.cs | 27 -------- .../Contracts/TableDesignerInfo.cs | 7 ++- .../Contracts/TableDesignerValidationError.cs | 4 -- .../ViewModel/ObjectViewModelBase.cs | 15 +++++ .../ViewModel/TableColumnViewModel.cs | 25 ++++++++ .../Contracts/ViewModel/TableViewModel.cs | 37 +++++++++++ .../TableDesigner/TableDesignerService.cs | 62 ++++++++++++++++--- .../TableColumnCollectionTest.cs | 30 +++++++++ .../TableDesignerChangeInfoTest.cs | 30 +++++++++ 18 files changed, 310 insertions(+), 83 deletions(-) create mode 100644 src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Constants.cs delete mode 100644 src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableColumn.cs delete mode 100644 src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDataModel.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/ObjectViewModelBase.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/TableColumnViewModel.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/TableViewModel.cs create mode 100644 test/Microsoft.SqlTools.ServiceLayer.UnitTests/TableDesigner/TableColumnCollectionTest.cs create mode 100644 test/Microsoft.SqlTools.ServiceLayer.UnitTests/TableDesigner/TableDesignerChangeInfoTest.cs diff --git a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageDispatcher.cs b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageDispatcher.cs index ceb7514b..d188f22c 100644 --- a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageDispatcher.cs +++ b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageDispatcher.cs @@ -126,8 +126,14 @@ namespace Microsoft.SqlTools.Hosting.Protocol TParams typedParams = default(TParams); if (requestMessage.Contents != null) { - // TODO: Catch parse errors! - typedParams = requestMessage.Contents.ToObject(); + try + { + typedParams = requestMessage.Contents.ToObject(); + } + catch (Exception ex) + { + return requestContext.SendError(ex.Message); + } } return requestHandler(typedParams, requestContext); @@ -256,7 +262,7 @@ namespace Microsoft.SqlTools.Hosting.Protocol } protected async Task DispatchMessage( - Message messageToDispatch, + Message messageToDispatch, MessageWriter messageWriter) { Task handlerToAwait = null; diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Constants.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Constants.cs new file mode 100644 index 00000000..da31be24 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Constants.cs @@ -0,0 +1,31 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System; +using System.Threading.Tasks; +using Microsoft.SqlTools.Hosting.Protocol; +using Microsoft.SqlTools.ServiceLayer.Hosting; +using Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner +{ + public static class TablePropertyNames + { + public const string Name = "name"; + public const string Schema = "schema"; + public const string Description = "description"; + public const string Columns = "columns"; + } + + public static class TableColumnPropertyNames + { + public const string Name = "name"; + public const string Type = "type"; + public const string DefaultValue = "defaultValue"; + public const string Length = "length"; + public const string AllowNulls = "allowNulls"; + public const string IsPrimaryKey = "isPrimaryKey"; + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/ComponentPropertiesBase.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/ComponentPropertiesBase.cs index f02c023d..df1b3ea6 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/ComponentPropertiesBase.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/ComponentPropertiesBase.cs @@ -12,17 +12,12 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts /// public abstract class ComponentPropertiesBase { - public ComponentPropertiesBase() - { - this.Enabled = true; - } - public string Title { get; set; } public string AriaLabel { get; set; } public Nullable Width { get; set; } - public bool Enabled { get; set; } + public bool Enabled { get; set; } = true; } } \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/DropdownProperties.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/DropdownProperties.cs index e6b99195..1157b9fa 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/DropdownProperties.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/DropdownProperties.cs @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +using System.Collections.Generic; + namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts { /// @@ -12,6 +14,6 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts { public string Value { get; set; } - public string[] Values { get; set; } + public List Values { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/TableProperties.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/TableProperties.cs index 22944b91..00b8263c 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/TableProperties.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/TableProperties.cs @@ -3,12 +3,16 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts { /// /// Table component properties /// - public class TableProperties : ComponentPropertiesBase + public abstract class TableComponentProperties : ComponentPropertiesBase where T : ObjectViewModelBase { /// /// The column names to be displayed @@ -23,11 +27,38 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts /// /// All properties of the object. /// - public DesignerDataPropertyInfo[] ItemProperties { get; set; } + public List ItemProperties { get; set; } = new List(); /// /// The object list. /// - public T[] Data { get; set; } + public List Data { get; set; } = new List(); + + /// + /// Add a new object into the Data property + /// + public void AddNew() + { + this.Data.Add(this.CreateNew(this.GetDefaultNewObjectName())); + } + + protected abstract string NewObjectNamePrefix { get; } + + protected abstract T CreateNew(string name); + + /// + /// Get the next available name for a new item + /// + protected string GetDefaultNewObjectName() + { + int i = 1; + string newName; + do + { + newName = string.Format("{0}{1}", this.NewObjectNamePrefix, i); + i++; + } while (this.Data?.AsEnumerable().FirstOrDefault(obj => string.Equals(obj.Name?.Value, newName, StringComparison.InvariantCultureIgnoreCase)) != null); + return newName; + } } } \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/ProcessTableDesignerEditRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/ProcessTableDesignerEditRequest.cs index 83f1d856..be548760 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/ProcessTableDesignerEditRequest.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/ProcessTableDesignerEditRequest.cs @@ -14,12 +14,12 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts public TableDesignerChangeInfo TableChangeInfo { get; set; } - public TableDataModel Data { get; set; } + public TableViewModel ViewModel { get; set; } } public class ProcessTableDesignerEditResponse { - public TableDataModel Data { get; set; } + public TableViewModel ViewModel { get; set; } public bool IsValid { get; set; } diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/SaveTableChangesRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/SaveTableChangesRequest.cs index 520cf555..15081777 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/SaveTableChangesRequest.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/SaveTableChangesRequest.cs @@ -12,7 +12,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts { public TableInfo TableInfo { get; set; } - public TableDataModel Data { get; set; } + public TableViewModel ViewModel { get; set; } } public class SaveTableChangesResponse diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableChangeInfo.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableChangeInfo.cs index c8e13ef3..6818953e 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableChangeInfo.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableChangeInfo.cs @@ -3,6 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +using System; using System.Runtime.Serialization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -27,8 +28,41 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts { public DesignerEditType Type { get; set; } + [JsonConverter(typeof(TableDesignerPropertyConverter))] public object Property { get; set; } public object Value { get; set; } } + + /// + /// The property "Property" of TableDesignerChangeInfo could be string or TableDesignerPropertyIdentifier, use this custom converter to set the property value. + /// + public class TableDesignerPropertyConverter : JsonConverter + { + public override bool CanConvert(Type objectType) + { + return true; + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + object property; + if (reader.TokenType == JsonToken.StartObject) + { + TableDesignerPropertyIdentifier obj = serializer.Deserialize(reader, typeof(TableDesignerPropertyIdentifier)) as TableDesignerPropertyIdentifier; + property = obj; + } + else + { + property = reader.Value; + } + return property; + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + // We don't need to serialize this class. + throw new NotImplementedException(); + } + } } \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableColumn.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableColumn.cs deleted file mode 100644 index 32101226..00000000 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableColumn.cs +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts -{ - /// - /// The data model of a table column object - /// - public class TableColumn - { - public InputBoxProperties Name { get; set; } - - public DropdownProperties Type { get; set; } - - public InputBoxProperties Length { get; set; } - - public CheckBoxProperties AllowNulls { get; set; } - - public InputBoxProperties DefaultValue { get; set; } - - public CheckBoxProperties IsPrimaryKey { get; set; } - } -} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDataModel.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDataModel.cs deleted file mode 100644 index a86d40cb..00000000 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDataModel.cs +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright (c) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts -{ - /// - /// The data model for a table object - /// - public class TableDataModel - { - public InputBoxProperties Name { get; set; } - - public DropdownProperties Schema { get; set; } - - public InputBoxProperties Description { get; set; } - - public TableColumnCollection Columns { get; set; } - - public InputBoxProperties Script { get; set; } - } - - public class TableColumnCollection : TableProperties - { - } -} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerInfo.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerInfo.cs index a5bb108a..47d01151 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerInfo.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerInfo.cs @@ -2,6 +2,7 @@ // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +using System.Collections.Generic; namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts { @@ -12,10 +13,10 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts { public TableDesignerView View { get; set; } - public TableDataModel Data { get; set; } + public TableViewModel ViewModel { get; set; } - public string[] ColumnTypes { get; set; } + public List ColumnTypes { get; set; } - public string[] Schemas { get; set; } + public List Schemas { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerValidationError.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerValidationError.cs index d57ffc1a..eaeadd8d 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerValidationError.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerValidationError.cs @@ -3,10 +3,6 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -using Microsoft.SqlTools.Hosting.Protocol.Contracts; -using Microsoft.SqlTools.ServiceLayer.Utility; -using Microsoft.SqlTools.Utility; - namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts { /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/ObjectViewModelBase.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/ObjectViewModelBase.cs new file mode 100644 index 00000000..c31092c5 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/ObjectViewModelBase.cs @@ -0,0 +1,15 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// The base class for view model object. + /// + public abstract class ObjectViewModelBase + { + public InputBoxProperties Name { get; set; } = new InputBoxProperties(); + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/TableColumnViewModel.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/TableColumnViewModel.cs new file mode 100644 index 00000000..a24c0a26 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/TableColumnViewModel.cs @@ -0,0 +1,25 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using Newtonsoft.Json; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// The view model of a table column object + /// + public class TableColumnViewModel : ObjectViewModelBase + { + public DropdownProperties Type { get; set; } = new DropdownProperties(); + + public InputBoxProperties Length { get; set; } = new InputBoxProperties(); + + public CheckBoxProperties AllowNulls { get; set; } = new CheckBoxProperties(); + + public InputBoxProperties DefaultValue { get; set; } = new InputBoxProperties(); + + public CheckBoxProperties IsPrimaryKey { get; set; } = new CheckBoxProperties(); + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/TableViewModel.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/TableViewModel.cs new file mode 100644 index 00000000..ca37b054 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/ViewModel/TableViewModel.cs @@ -0,0 +1,37 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using Newtonsoft.Json; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// The view model for a table object + /// + public class TableViewModel : ObjectViewModelBase + { + public DropdownProperties Schema { get; set; } = new DropdownProperties(); + + public InputBoxProperties Description { get; set; } = new InputBoxProperties(); + + public TableColumnCollection Columns { get; set; } = new TableColumnCollection(); + + public InputBoxProperties Script { get; set; } = new InputBoxProperties(); + } + + public class TableColumnCollection : TableComponentProperties + { + [JsonIgnore] + protected override string NewObjectNamePrefix { get { return "column"; } } + + protected override TableColumnViewModel CreateNew(string name) + { + //TODO: Add the default values + var column = new TableColumnViewModel(); + column.Name.Value = this.GetDefaultNewObjectName(); + return column; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs index efa07ebd..17d360d7 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs @@ -4,6 +4,7 @@ // using System; +using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.SqlTools.Hosting.Protocol; using Microsoft.SqlTools.ServiceLayer.Hosting; @@ -57,15 +58,15 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner { try { - // TODO - TableDataModel tableModel = new TableDataModel(); + // TODO: populate the data and view information + TableViewModel tableModel = new TableViewModel(); TableDesignerView view = new TableDesignerView(); await requestContext.SendResult(new TableDesignerInfo() { - Data = tableModel, + ViewModel = tableModel, View = view, - ColumnTypes = new string[] { }, - Schemas = new string[] { } + ColumnTypes = this.GetSupportedColumnTypes(tableInfo), + Schemas = this.GetSchemas(tableInfo) }); } catch (Exception e) @@ -81,10 +82,21 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner { try { - // TODO + switch (requestParams.TableChangeInfo.Type) + { + case DesignerEditType.Add: + this.HandleAddItemRequest(requestParams); + break; + case DesignerEditType.Remove: + // TODO: Handle 'Remove' request + break; + default: + // TODO: Handle 'Update' request + break; + } await requestContext.SendResult(new ProcessTableDesignerEditResponse() { - Data = requestParams.Data, + ViewModel = requestParams.ViewModel, IsValid = true }); } @@ -101,7 +113,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner { try { - // TODO + // TODO: Handle the save changes request. await requestContext.SendResult(new SaveTableChangesResponse()); } catch (Exception e) @@ -111,6 +123,40 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner }); } + private void HandleAddItemRequest(ProcessTableDesignerEditRequestParams requestParams) + { + var property = requestParams.TableChangeInfo.Property; + // Handle the add item request on top level table properties, e.g. Columns, Indexes. + if (property.GetType() == typeof(string)) + { + string propertyName = property as string; + switch (propertyName) + { + case TablePropertyNames.Columns: + requestParams.ViewModel.Columns.AddNew(); + break; + default: + break; + } + } else { + // TODO: Handle the add item request on second level properties, e.g. Adding a column to an index + } + } + + private List GetSupportedColumnTypes(TableInfo tableInfo) + { + //TODO: get the supported column types. + var columnTypes = new List(); + return columnTypes; + } + + private List GetSchemas(TableInfo tableInfo) + { + //TODO: get the schemas. + var schemas = new List(); + return schemas; + } + /// /// Disposes the table designer Service /// diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/TableDesigner/TableColumnCollectionTest.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/TableDesigner/TableColumnCollectionTest.cs new file mode 100644 index 00000000..89e786ea --- /dev/null +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/TableDesigner/TableColumnCollectionTest.cs @@ -0,0 +1,30 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System; +using Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts; +using NUnit.Framework; +using Newtonsoft.Json; + +namespace Microsoft.SqlTools.ServiceLayer.UnitTests.TableDesigner +{ + public class TableColumnCollectionTest + { + [Test] + public void AutoNameForNewItemTest() + { + var collection = new TableColumnCollection(); + collection.AddNew(); + Assert.AreEqual(1, collection.Data.Count, "The item count should be 1"); + Assert.AreEqual("column1", collection.Data[0].Name.Value); + collection.Data.Add(new TableColumnViewModel() { Name = new InputBoxProperties() { Value = "column3" } }); + Assert.AreEqual(2, collection.Data.Count, "The item count should be 2"); + collection.AddNew(); + Assert.AreEqual(3, collection.Data.Count, "The item count should be 3"); + // the name that is not yet used should be picked + Assert.AreEqual("column2", collection.Data[2].Name.Value); + } + } +} diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/TableDesigner/TableDesignerChangeInfoTest.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/TableDesigner/TableDesignerChangeInfoTest.cs new file mode 100644 index 00000000..c7a79d7a --- /dev/null +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/TableDesigner/TableDesignerChangeInfoTest.cs @@ -0,0 +1,30 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System; +using Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts; +using NUnit.Framework; +using Newtonsoft.Json; + +namespace Microsoft.SqlTools.ServiceLayer.UnitTests.TableDesigner +{ + public class TableDesignerChangeInfoTest + { + [Test] + public void DeserializeTableChangeProperty() + { + string testJsonStringType = "{\"type\": 1, \"property\": \"columns\"}"; + TableDesignerChangeInfo changeInfo = JsonConvert.DeserializeObject(testJsonStringType); + Assert.IsNotNull(changeInfo, "string property: the changeInfo shouldn't be null."); + Assert.IsNotNull(changeInfo.Property, "string property: the property shouldn't be null."); + Assert.IsTrue(changeInfo.Property.GetType() == typeof(string)); + string testJsonObjectType = "{\"type\": 1, \"property\": {\"parentProperty\": \"columns\",\"index\": 0,\"property\": \"length\"}}"; + changeInfo = JsonConvert.DeserializeObject(testJsonObjectType); + Assert.IsNotNull(changeInfo, "object property: the changeInfo shouldn't be null."); + Assert.IsNotNull(changeInfo.Property, "object property: the property shouldn't be null."); + Assert.IsTrue(changeInfo.Property.GetType() == typeof(TableDesignerPropertyIdentifier)); + } + } +}