Skip to content
This repository was archived by the owner on Nov 25, 2023. It is now read-only.

Commit ac22797

Browse files
committed
Store supported keyboards in Dictionary
1 parent d5b5464 commit ac22797

File tree

6 files changed

+128
-75
lines changed

6 files changed

+128
-75
lines changed

src/InvvardDev.EZLayoutDisplay.Desktop/Service/Design/LayoutService.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,11 @@ public async Task<IEnumerable<KeyTemplate>> GetLayoutTemplate(string geometry)
4141

4242
return await layoutTemplate;
4343
}
44+
45+
/// <inheritdoc />
46+
public bool SupportsGeometry(string geometry)
47+
{
48+
return true;
49+
}
4450
}
4551
}

src/InvvardDev.EZLayoutDisplay.Desktop/Service/Implementation/LayoutService.cs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ public class LayoutService : ILayoutService
1616
{
1717
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
1818

19+
/// <summary>
20+
/// Supported keyboards and their layout definition resources.
21+
/// </summary>
22+
private static readonly Dictionary<string, byte[]> LayoutDefinitions = new Dictionary<string, byte[]>()
23+
{
24+
{ "ergodox-ez", Resources.layoutDefinition_ergodox },
25+
{ "moonlander", Resources.layoutDefinition_moonlander }
26+
};
27+
1928
private readonly string GetLayoutBody =
2029
"{{\"operationName\":\"getLayout\",\"variables\":{{\"hashId\":\"{0}\",\"revisionId\":\"{1}\"}},\"query\":\"query getLayout($hashId: String!, $revisionId: String!) {{\\n Layout(hashId: $hashId, revisionId: $revisionId) {{\\n ...LayoutData\\n }}\\n}}\\n\\nfragment LayoutData on Layout {{\\n geometry\\n hashId\\n title\\n tags {{\\n id\\n hashId\\n name\\n }}\\n revision {{\\n ...RevisionData\\n }}\\n}}\\n\\nfragment RevisionData on Revision {{\\n hashId\\n model\\n title\\n swatch\\n hexUrl\\n zipUrl\\n qmkVersion\\n qmkUptodate\\n config\\n layers {{\\n hashId\\n keys\\n position\\n title\\n color\\n}}\\n}}\\n\"}}";
2130

@@ -75,6 +84,12 @@ public async Task<IEnumerable<KeyTemplate>> GetLayoutTemplate(string geometry)
7584
return layoutTemplate;
7685
}
7786

87+
/// <inheritdoc />
88+
public bool SupportsGeometry(string geometry)
89+
{
90+
return LayoutDefinitions.ContainsKey(geometry);
91+
}
92+
7893
#endregion
7994

8095
#region Private methods
@@ -132,17 +147,9 @@ private async Task<IEnumerable<KeyTemplate>> ReadLayoutDefinition(string geometr
132147

133148
byte[] layoutDefinitionJson;
134149

135-
switch (geometry)
150+
if (!LayoutDefinitions.TryGetValue(geometry, out layoutDefinitionJson))
136151
{
137-
case "ergodox-ez":
138-
layoutDefinitionJson = Resources.layoutDefinition_ergodox;
139-
break;
140-
case "moonlander":
141-
layoutDefinitionJson = Resources.layoutDefinition_moonlander;
142-
break;
143-
default:
144-
layoutDefinitionJson = Resources.layoutDefinition;
145-
break;
152+
layoutDefinitionJson = Resources.layoutDefinition;
146153
}
147154

148155
if (layoutDefinitionJson.Length <= 0)

src/InvvardDev.EZLayoutDisplay.Desktop/Service/Interface/ILayoutService.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,11 @@ public interface ILayoutService
3434
/// </summary>
3535
/// <returns>An <see cref="IEnumerable{KeyTemplate}"/></returns>
3636
Task<IEnumerable<KeyTemplate>> GetLayoutTemplate(string geometry);
37+
38+
/// <summary>
39+
/// Returns whether the keyboard geometry is supported.
40+
/// </summary>
41+
/// <returns>true if supported, false if not</returns>
42+
bool SupportsGeometry(string geometry);
3743
}
3844
}

src/InvvardDev.EZLayoutDisplay.Desktop/ViewModel/DisplayLayoutViewModel.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -270,19 +270,20 @@ private async void LoadCompleteLayout()
270270
NoLayoutAvailable = true;
271271

272272
return;
273-
}
274-
275-
NoLayoutAvailable = false;
276-
await PopulateLayoutTemplates(_ezLayout.Geometry);
277-
278-
if (_layoutTemplates.Count == 0)
273+
} else if (!_layoutService.SupportsGeometry(_ezLayout.Geometry))
279274
{
280275
Logger.Info("Geometry not supported");
281276
NoLayoutWarningFirstLine = "Not supported!";
282277
NoLayoutWarningSecondLine = "Sorry, your keyboard is not supported yet.";
283278
NoLayoutAvailable = true;
279+
280+
return;
284281
}
285282

283+
NoLayoutAvailable = false;
284+
285+
await PopulateLayoutTemplates(_ezLayout.Geometry);
286+
286287
SwitchLayer();
287288
}
288289

src/InvvardDev.EZLayoutDisplay.Tests/Service/LayoutServiceTest.cs

Lines changed: 85 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,29 @@ public class LayoutServiceTest
1414
{
1515
private static ErgodoxLayout InitializeDataTree()
1616
{
17-
return new ErgodoxLayout {
18-
Title = "",
19-
HashId = "",
20-
Revision = new Revision {
21-
HashId = "hashId-1",
22-
Layers = new List<ErgodoxLayer> {
17+
return new ErgodoxLayout
18+
{
19+
Title = "",
20+
HashId = "",
21+
Revision = new Revision
22+
{
23+
HashId = "hashId-1",
24+
Layers = new List<ErgodoxLayer> {
2325
new ErgodoxLayer() {
2426
Color = "",
2527
Title = "",
2628
Position = 0,
2729
Keys = new List<ErgodoxKey>()
2830
}
2931
}
30-
}
31-
};
32+
}
33+
};
3234
}
3335

34-
[ Theory ]
35-
[ InlineData("EOEb", true) ]
36-
[ InlineData("default", true) ]
37-
[ InlineData("test", false) ]
36+
[Theory]
37+
[InlineData("EOEb", true)]
38+
[InlineData("default", true)]
39+
[InlineData("test", false)]
3840
public async Task GetLayoutInfo(string layoutHashId, bool exist)
3941
{
4042
// Arrange
@@ -63,10 +65,10 @@ public async Task GetLayoutInfo(string layoutHashId, bool exist)
6365
}
6466
}
6567

66-
[ Theory ]
67-
[ InlineData("EOEb", true) ]
68-
[ InlineData("default", true) ]
69-
[ InlineData("test", false) ]
68+
[Theory]
69+
[InlineData("EOEb", true)]
70+
[InlineData("default", true)]
71+
[InlineData("test", false)]
7072
public async Task GetErgodoxLayout(string layoutHashId, bool exist)
7173
{
7274
// Arrange
@@ -95,25 +97,28 @@ public async Task GetErgodoxLayout(string layoutHashId, bool exist)
9597
}
9698
}
9799

98-
[ Fact ]
100+
[Fact]
99101
public void PrepareEZLayout_OneLayer_ManyKeys()
100102
{
101103
// Arrange
102104
ILayoutService layoutService = new LayoutService();
103105
ErgodoxLayout ergodoxLayout = InitializeDataTree();
104106
var keys = ergodoxLayout.Revision.Layers.First().Keys;
105-
keys.Add(new ErgodoxKey() {
106-
GlowColor = "",
107-
Code = "KC_A"
108-
});
109-
keys.Add(new ErgodoxKey() {
110-
GlowColor = "",
111-
Code = "KC_0"
112-
});
113-
keys.Add(new ErgodoxKey() {
114-
GlowColor = "",
115-
Code = "KC_TRANSPARENT"
116-
});
107+
keys.Add(new ErgodoxKey()
108+
{
109+
GlowColor = "",
110+
Code = "KC_A"
111+
});
112+
keys.Add(new ErgodoxKey()
113+
{
114+
GlowColor = "",
115+
Code = "KC_0"
116+
});
117+
keys.Add(new ErgodoxKey()
118+
{
119+
GlowColor = "",
120+
Code = "KC_TRANSPARENT"
121+
});
117122
EZLayout ezLayoutResult;
118123

119124
// Act
@@ -132,42 +137,48 @@ public void PrepareEZLayout_OneLayer_ManyKeys()
132137
Assert.Equal(KeyCategory.Other, keyResults[2].KeyCategory);
133138
}
134139

135-
[ Fact ]
140+
[Fact]
136141
public void PrepareEZLayout_TwoLayer_ManyKeys()
137142
{
138143
// Arrange
139144
ILayoutService layoutService = new LayoutService();
140145
ErgodoxLayout ergodoxLayout = InitializeDataTree();
141146
var layer0Keys = ergodoxLayout.Revision.Layers.First().Keys;
142-
layer0Keys.Add(new ErgodoxKey() {
143-
GlowColor = "",
144-
Code = "KC_A"
145-
});
146-
layer0Keys.Add(new ErgodoxKey() {
147-
GlowColor = "",
148-
Code = "KC_0"
149-
});
150-
layer0Keys.Add(new ErgodoxKey() {
151-
GlowColor = "",
152-
Code = "KC_TRANSPARENT"
153-
});
147+
layer0Keys.Add(new ErgodoxKey()
148+
{
149+
GlowColor = "",
150+
Code = "KC_A"
151+
});
152+
layer0Keys.Add(new ErgodoxKey()
153+
{
154+
GlowColor = "",
155+
Code = "KC_0"
156+
});
157+
layer0Keys.Add(new ErgodoxKey()
158+
{
159+
GlowColor = "",
160+
Code = "KC_TRANSPARENT"
161+
});
154162

155163
ergodoxLayout.Revision
156-
.Layers.Add(new ErgodoxLayer {
157-
Color = "color",
158-
Title = "Layer 2",
159-
Position = 1,
160-
Keys = new List<ErgodoxKey>()
161-
});
164+
.Layers.Add(new ErgodoxLayer
165+
{
166+
Color = "color",
167+
Title = "Layer 2",
168+
Position = 1,
169+
Keys = new List<ErgodoxKey>()
170+
});
162171
var layer1Keys = ergodoxLayout.Revision.Layers[1].Keys;
163-
layer1Keys.Add(new ErgodoxKey() {
164-
GlowColor = "",
165-
Code = "KC_F1"
166-
});
167-
layer1Keys.Add(new ErgodoxKey() {
168-
GlowColor = "",
169-
Code = "KC_SPACE"
170-
});
172+
layer1Keys.Add(new ErgodoxKey()
173+
{
174+
GlowColor = "",
175+
Code = "KC_F1"
176+
});
177+
layer1Keys.Add(new ErgodoxKey()
178+
{
179+
GlowColor = "",
180+
Code = "KC_SPACE"
181+
});
171182
EZLayout ezLayoutResult;
172183

173184
// Act
@@ -193,7 +204,7 @@ public void PrepareEZLayout_TwoLayer_ManyKeys()
193204
Assert.Equal(KeyCategory.Spacing, layer1KeyResults[1].KeyCategory);
194205
}
195206

196-
[ Fact ]
207+
[Fact]
197208
public async Task GetErgodoxLayout_HashIdNull()
198209
{
199210
// Arrange
@@ -202,5 +213,22 @@ public async Task GetErgodoxLayout_HashIdNull()
202213
// Act
203214
await Assert.ThrowsAsync<ArgumentNullException>(() => layoutService.GetErgodoxLayout("", ""));
204215
}
216+
217+
[Theory]
218+
[InlineData("ergodox-ez", true)]
219+
[InlineData("moonlander", true)]
220+
[InlineData("planck-ez", false)]
221+
[InlineData("foobarbaz", false)]
222+
public void SupportsGeometry(string geometry, bool expected)
223+
{
224+
// Arrange
225+
ILayoutService layoutService = new LayoutService();
226+
227+
// Act
228+
bool actual = layoutService.SupportsGeometry(geometry);
229+
230+
// Assert
231+
Assert.Equal(expected, actual);
232+
}
205233
}
206234
}

src/InvvardDev.EZLayoutDisplay.Tests/ViewModel/DisplayLayoutViewModelTest.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,15 @@ public void DisplayLayoutViewModel_Constructor()
3737
var mockLayoutService = new Mock<ILayoutService>();
3838
var mockSettingsService = new Mock<ISettingsService>();
3939
mockSettingsService.SetupProperty(s => s.EZLayout, CreateLayers(1));
40+
mockLayoutService.Setup(l => l.SupportsGeometry(null)).Returns(true).Verifiable();
4041

4142
//Act
4243
var displayLayoutViewModel = new DisplayLayoutViewModel(mockWindowService.Object, mockLayoutService.Object, mockSettingsService.Object);
4344

4445
//Assert
4546
Assert.Equal("ErgoDox Layout", displayLayoutViewModel.WindowTitle);
46-
Assert.Equal("Not supported!", displayLayoutViewModel.NoLayoutWarningFirstLine);
47-
Assert.Equal("Sorry, your keyboard is not supported yet.", displayLayoutViewModel.NoLayoutWarningSecondLine);
47+
Assert.Null(displayLayoutViewModel.NoLayoutWarningFirstLine);
48+
Assert.Null(displayLayoutViewModel.NoLayoutWarningSecondLine);
4849
Assert.Equal("Current layer :", displayLayoutViewModel.CurrentLayerNameTitle);
4950
Assert.Equal("", displayLayoutViewModel.CurrentLayerName);
5051
Assert.Equal("Scroll up/down or press 'Space' to display next layer", displayLayoutViewModel.ControlHintSpaceLabel);
@@ -142,6 +143,7 @@ public void LoadCompleteLayout(int numberOfKey, int numberOfLayer, bool noLayout
142143

143144
var mockWindowService = new Mock<IWindowService>();
144145
var mockLayoutService = new Mock<ILayoutService>();
146+
mockLayoutService.Setup(l => l.SupportsGeometry(null)).Returns(true);
145147
mockLayoutService.Setup(l => l.GetLayoutTemplate(null)).ReturnsAsync(layoutTemplate).Verifiable();
146148
var mockSettingsService = new Mock<ISettingsService>();
147149
mockSettingsService.SetupProperty(s => s.EZLayout, keyboardLayout);
@@ -171,6 +173,7 @@ public void NextLayerCommand_CanExecute(int layerNumber, bool expectedCanExecute
171173
}
172174

173175
var mockLayoutService = new Mock<ILayoutService>();
176+
mockLayoutService.Setup(l => l.SupportsGeometry(null)).Returns(true);
174177
mockLayoutService.Setup(l => l.GetLayoutTemplate(null)).ReturnsAsync(layoutTemplate);
175178
var mockWindowService = new Mock<IWindowService>();
176179
var mockSettingsService = new Mock<ISettingsService>();
@@ -212,6 +215,7 @@ public void ScrollLayerCommand_Execute(int layerNumber, int expectedCurrentLayer
212215
}
213216

214217
var mockLayoutService = new Mock<ILayoutService>();
218+
mockLayoutService.Setup(l => l.SupportsGeometry(null)).Returns(true);
215219
mockLayoutService.Setup(l => l.GetLayoutTemplate(null)).ReturnsAsync(layoutTemplate);
216220
var mockWindowService = new Mock<IWindowService>();
217221
var mockSettingsService = new Mock<ISettingsService>();
@@ -252,6 +256,7 @@ public void NextLayerCommand_Execute(int layerNumber, int nextLayerHit, int expe
252256
}
253257

254258
var mockLayoutService = new Mock<ILayoutService>();
259+
mockLayoutService.Setup(l => l.SupportsGeometry(null)).Returns(true);
255260
mockLayoutService.Setup(l => l.GetLayoutTemplate(null)).ReturnsAsync(layoutTemplate);
256261
var mockWindowService = new Mock<IWindowService>();
257262
var mockSettingsService = new Mock<ISettingsService>();

0 commit comments

Comments
 (0)