Skip to content

Commit 41477e7

Browse files
Add BanWordParser and related unit tests (#55)
Introduces BanWordParser for parsing ban words and UGC ban words from XML files. Adds BanWordParserTest to verify correct parsing and updates project version to 2.3.4.
1 parent 328356c commit 41477e7

3 files changed

Lines changed: 94 additions & 1 deletion

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System.Diagnostics;
2+
using System.Xml;
3+
using System.Xml.Serialization;
4+
using Maple2.File.IO;
5+
using Maple2.File.IO.Crypto.Common;
6+
using Maple2.File.Parser.Xml.String;
7+
8+
namespace Maple2.File.Parser;
9+
10+
public class BanWordParser {
11+
private readonly M2dReader xmlReader;
12+
private readonly XmlSerializer nameSerializer;
13+
14+
public BanWordParser(M2dReader xmlReader) {
15+
this.xmlReader = xmlReader;
16+
nameSerializer = new XmlSerializer(typeof(StringMapping));
17+
}
18+
19+
public IEnumerable<(int Id, string Name)> ParseBanWords() {
20+
int i = 0;
21+
foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.Contains("banword") && !entry.Name.Contains("ugc"))) {
22+
XmlReader reader = xmlReader.GetXmlReader(entry);
23+
var mapping = nameSerializer.Deserialize(reader) as StringMapping;
24+
25+
Debug.Assert(mapping != null);
26+
27+
Dictionary<int, string> banWords = mapping.key.ToDictionary(_ => i++, key => key.name);
28+
foreach (var banWord in banWords) {
29+
if (string.IsNullOrEmpty(banWord.Value)) {
30+
continue;
31+
}
32+
yield return (banWord.Key, banWord.Value);
33+
}
34+
}
35+
}
36+
37+
public IEnumerable<(int Id, string Name)> ParseUgcBanWords() {
38+
int i = 0;
39+
foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.Contains("ugcbanword"))) {
40+
XmlReader reader = xmlReader.GetXmlReader(entry);
41+
var mapping = nameSerializer.Deserialize(reader) as StringMapping;
42+
43+
Debug.Assert(mapping != null);
44+
45+
Dictionary<int, string> banWords = mapping.key.ToDictionary(_ => i++, key => key.name);
46+
foreach (var banWord in banWords) {
47+
if (string.IsNullOrEmpty(banWord.Value)) {
48+
continue;
49+
}
50+
yield return (banWord.Key, banWord.Value);
51+
}
52+
}
53+
}
54+
}

Maple2.File.Parser/Maple2.File.Parser.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<PackageTags>MapleStory2, File, Parser, m2d, xml</PackageTags>
1414
<!-- Use following lines to write the generated files to disk. -->
1515
<EmitCompilerGeneratedFiles Condition=" '$(Configuration)' == 'Debug' ">true</EmitCompilerGeneratedFiles>
16-
<PackageVersion>2.3.3</PackageVersion>
16+
<PackageVersion>2.3.4</PackageVersion>
1717
<TargetFramework>net8.0</TargetFramework>
1818
<PackageReadmeFile>README.md</PackageReadmeFile>
1919
<ImplicitUsings>enable</ImplicitUsings>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using Maple2.File.Parser;
2+
using Maple2.File.Parser.Enum;
3+
using Maple2.File.Parser.Tools;
4+
using Microsoft.VisualStudio.TestTools.UnitTesting;
5+
6+
namespace Maple2.File.Tests;
7+
8+
[TestClass]
9+
public class BanWordParserTest {
10+
[TestMethod]
11+
public void TestBanWordParser() {
12+
var locale = Locale.NA;
13+
Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live");
14+
var parser = new BanWordParser(TestUtils.XmlReader);
15+
16+
int count = 0;
17+
foreach ((int id, string name) in parser.ParseBanWords()) {
18+
Assert.IsTrue(id >= 0);
19+
Assert.IsFalse(string.IsNullOrEmpty(name));
20+
count++;
21+
}
22+
Assert.AreEqual(6179, count);
23+
}
24+
25+
[TestMethod]
26+
public void TestUgcBanWordParser() {
27+
var locale = Locale.NA;
28+
Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live");
29+
var parser = new BanWordParser(TestUtils.XmlReader);
30+
31+
int count = 0;
32+
foreach ((int id, string name) in parser.ParseUgcBanWords()) {
33+
Assert.IsTrue(id >= 0);
34+
Assert.IsFalse(string.IsNullOrEmpty(name));
35+
count++;
36+
}
37+
Assert.AreEqual(1208, count);
38+
}
39+
}

0 commit comments

Comments
 (0)