Skip to content

Commit f15b594

Browse files
committed
Refactor Android model extraction and clean up tests
Refactored TryExtractAndroidModel in UserAgentHelpers.cs for clarity by extracting helper methods and modularizing logic. Improved code style in ChunkedStreamTests.cs by clarifying arithmetic expressions. Removed unused IPv6 test code from IpAddressHelpersTests.cs. No changes to core logic or behavior.
1 parent 5a2321e commit f15b594

3 files changed

Lines changed: 53 additions & 33 deletions

File tree

Sources/EasyExtensions.Tests/ChunkedStreamTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public void GetChunks_FinalChunkIsSmaller_WhenLengthNotMultipleOfChunkSize()
5959
{
6060
Assert.That(chunks[0].Length, Is.EqualTo(chunkSize));
6161
Assert.That(chunks[1].Length, Is.EqualTo(chunkSize));
62-
Assert.That(chunks[2].Length, Is.EqualTo(totalSize - 2 * chunkSize));
62+
Assert.That(chunks[2].Length, Is.EqualTo(totalSize - (2 * chunkSize)));
6363
}
6464

6565
// Verify content of last chunk (do not dispose before reading)
@@ -211,7 +211,7 @@ public void GetChunks_ReturnsConsistentChunkSizes_ForLargeStreams()
211211
{
212212
// Arrange: create stream larger than typical buffer sizes
213213
var chunkSize = 8 * 1024 * 1024; // 8 MB
214-
var totalSize = chunkSize * 5 + chunkSize / 2; // 5.5 chunks
214+
var totalSize = (chunkSize * 5) + (chunkSize / 2); // 5.5 chunks
215215
var data = new byte[totalSize];
216216
new Random(1234).NextBytes(data);
217217
using var baseStream = new MemoryStream(data);

Sources/EasyExtensions.Tests/IpAddressHelpersTests.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,7 @@ public void GetMaskAddress_WithInvalidSubnetMask_ThrowsArgumentOutOfRangeExcepti
135135
Assert.Throws<ArgumentOutOfRangeException>(() => IpAddressHelpers.GetMaskAddress(invalidSubnetMask, AddressFamily.InterNetwork));
136136
}
137137

138-
139-
140138
// IPv6 tests
141-
142-
143139
[Test]
144140
public void ConvertIpV6ToNumber_ValidInput_ValidOutput()
145141
{
@@ -149,11 +145,9 @@ public void ConvertIpV6ToNumber_ValidInput_ValidOutput()
149145
Assert.That(actual, Is.EqualTo(expected));
150146
}
151147

152-
153148
// 2607:fb90:7328:47bf:3dfe:3f80:a256:8f65
154149
// network: 2607:fb90:7300::/40
155150
// broadcast: 2607:fb90:73ff:ffff:ffff:ffff:ffff:ffff
156-
157151
[Test]
158152
public void GetNetworkV6Address_ValidInput_ValidOutput()
159153
{
@@ -296,7 +290,6 @@ public void CalculateV4_WithValidInput_ValidOutput()
296290
forceParsed = IpAddressHelpers.IpToNumber(broadcastAddress);
297291
Assert.That(forceParsed, Is.EqualTo(expectedBroadcast));
298292

299-
300293
var subnet = IpAddressHelpers.ExtractMask(network);
301294
Assert.That(subnet?.ToString(), Is.EqualTo("255.255.252.0"));
302295
var actualNetwork = iPAddress.GetNetwork(subnet!).ToNumber();

Sources/EasyExtensions/Helpers/UserAgentHelpers.cs

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,47 @@ private static UserAgentDeviceType ResolveSamsungType(string samsungModelCode)
236236
return UserAgentDeviceType.SamsungPhone;
237237
}
238238

239+
private static string[]? TryGetParenthesesParts(string ua)
240+
{
241+
var p = Regex.Match(ua, @"\(([^)]*)\)");
242+
return p.Success ? p.Groups[1].Value.Split(';') : null;
243+
}
244+
245+
private static bool HasTabletToken(string[] parts)
246+
{
247+
foreach (var part in parts)
248+
{
249+
if (part.Trim().Equals("tablet", StringComparison.OrdinalIgnoreCase))
250+
{
251+
return true;
252+
}
253+
}
254+
255+
return false;
256+
}
257+
258+
private static bool IsAndroidToken(string token)
259+
{
260+
return token.StartsWith("Android", StringComparison.OrdinalIgnoreCase);
261+
}
262+
263+
private static bool IsNoiseModelToken(string token, bool hasTabletToken)
264+
{
265+
if (string.IsNullOrWhiteSpace(token))
266+
{
267+
return true;
268+
}
269+
270+
if (token.Equals("wv", StringComparison.OrdinalIgnoreCase)
271+
|| token.Equals("mobile", StringComparison.OrdinalIgnoreCase)
272+
|| token.Equals("tablet", StringComparison.OrdinalIgnoreCase))
273+
{
274+
return true;
275+
}
276+
277+
return hasTabletToken && token.StartsWith("rv:", StringComparison.OrdinalIgnoreCase);
278+
}
279+
239280
private static string? TryExtractAndroidModel(string ua)
240281
{
241282
// Pattern 1: ...; <model> Build/...
@@ -247,40 +288,25 @@ private static UserAgentDeviceType ResolveSamsungType(string samsungModelCode)
247288
}
248289

249290
// Pattern 2: (Linux; Android 13; SM-G981B) => take token after Android version
250-
var p = Regex.Match(ua, @"\(([^)]*)\)");
251-
if (!p.Success) return null;
252-
253-
var parts = p.Groups[1].Value.Split(';');
254-
var hasTabletToken = false;
255-
for (var k = 0; k < parts.Length; k++)
291+
var parts = TryGetParenthesesParts(ua);
292+
if (parts == null)
256293
{
257-
if (parts[k].Trim().Equals("tablet", StringComparison.OrdinalIgnoreCase))
258-
{
259-
hasTabletToken = true;
260-
break;
261-
}
294+
return null;
262295
}
263296

297+
var hasTabletToken = HasTabletToken(parts);
264298
for (var i = 0; i < parts.Length; i++)
265299
{
266300
var token = parts[i].Trim();
267-
if (!token.StartsWith("Android", StringComparison.OrdinalIgnoreCase)) continue;
301+
if (!IsAndroidToken(token))
302+
{
303+
continue;
304+
}
268305

269306
for (var j = i + 1; j < parts.Length; j++)
270307
{
271308
var cand = parts[j].Trim();
272-
if (string.IsNullOrWhiteSpace(cand)) continue;
273-
274-
// ignore common noise tokens
275-
if (cand.Equals("wv", StringComparison.OrdinalIgnoreCase)
276-
|| cand.Equals("mobile", StringComparison.OrdinalIgnoreCase)
277-
|| cand.Equals("tablet", StringComparison.OrdinalIgnoreCase))
278-
{
279-
continue;
280-
}
281-
282-
// If this UA explicitly says "Tablet", then tokens like "rv:102.0" are not a device model.
283-
if (hasTabletToken && cand.StartsWith("rv:", StringComparison.OrdinalIgnoreCase))
309+
if (IsNoiseModelToken(cand, hasTabletToken))
284310
{
285311
continue;
286312
}
@@ -291,6 +317,7 @@ private static UserAgentDeviceType ResolveSamsungType(string samsungModelCode)
291317

292318
return null;
293319
}
320+
294321
return null;
295322
}
296323

0 commit comments

Comments
 (0)