CHANGE: DrFxRule クラスからデータ読み込み機能を分離
@@ -0,0 +1,21 @@ | ||
1 | +using System; | |
2 | +using System.IO; | |
3 | + | |
4 | +namespace Sasa.QualityTools.DrFx.Core.Tests.Unit.TestingUtilities | |
5 | +{ | |
6 | + internal static class StreamGenerator | |
7 | + { | |
8 | + internal static Stream GenerateWith(string content) | |
9 | + { | |
10 | + MemoryStream stream = new MemoryStream(); | |
11 | + | |
12 | + StreamWriter writer = new StreamWriter(stream); | |
13 | + writer.Write(content); | |
14 | + writer.Flush(); | |
15 | + | |
16 | + stream.Seek(0, SeekOrigin.Begin); | |
17 | + | |
18 | + return stream; | |
19 | + } | |
20 | + } | |
21 | +} |
@@ -1,46 +0,0 @@ | ||
1 | -using NUnit.Framework; | |
2 | -using Sasa.QualityTools.DrFx.Core.Translation; | |
3 | -using System; | |
4 | -using System.Collections.Generic; | |
5 | - | |
6 | -namespace Sasa.QualityTools.DrFx.Core.Tests.Unit.Translation | |
7 | -{ | |
8 | - [TestFixture] | |
9 | - public class DrFxRuleTest | |
10 | - { | |
11 | - [Test] | |
12 | - public void TestParseXmlContents() | |
13 | - { | |
14 | - const string contents = | |
15 | - @"<?xml version=""1.0"" encoding=""utf-8"" ?>" + | |
16 | - @"<Rules>" + | |
17 | - @" <Rule CheckId=""CA0000"" Category=""Category1"">" + | |
18 | - @" <Name>Name1</Name>" + | |
19 | - @" <Resolution>" + | |
20 | - @" <Content>Content1</Content>" + | |
21 | - @" <Pattern>Pattern1</Pattern>" + | |
22 | - @" </Resolution>" + | |
23 | - @" <Resolution>" + | |
24 | - @" <Content>Content2</Content>" + | |
25 | - @" <Pattern>Pattern2</Pattern>" + | |
26 | - @" </Resolution>" + | |
27 | - @" </Rule>" + | |
28 | - @"</Rules>"; | |
29 | - | |
30 | - List<DrFxRule> rules = new List<DrFxRule>(DrFxRule.Parse(contents)); | |
31 | - | |
32 | - Assert.AreEqual(1, rules.Count); | |
33 | - DrFxRule rule = rules[0]; | |
34 | - Assert.AreEqual("CA0000", rule.CheckId); | |
35 | - Assert.AreEqual("Category1", rule.Category); | |
36 | - Assert.AreEqual("Name1", rule.Name); | |
37 | - | |
38 | - List<Resolution> resolutions = new List<Resolution>(rule.Resolutions); | |
39 | - Assert.AreEqual(2, resolutions.Count); | |
40 | - Assert.AreEqual("Content1", rule.Resolutions[0].Content); | |
41 | - Assert.AreEqual("Pattern1", rule.Resolutions[0].Pattern); | |
42 | - Assert.AreEqual("Content2", rule.Resolutions[1].Content); | |
43 | - Assert.AreEqual("Pattern2", rule.Resolutions[1].Pattern); | |
44 | - } | |
45 | - } | |
46 | -} |
@@ -0,0 +1,50 @@ | ||
1 | +using NUnit.Framework; | |
2 | +using Sasa.QualityTools.DrFx.Core.Translation; | |
3 | +using Sasa.QualityTools.DrFx.Core.Tests.Unit.TestingUtilities; | |
4 | +using System; | |
5 | +using System.Collections.Generic; | |
6 | +using System.IO; | |
7 | +using System.Text; | |
8 | + | |
9 | +namespace Sasa.QualityTools.DrFx.Core.Tests.Unit.Translation | |
10 | +{ | |
11 | + [TestFixture] | |
12 | + public class DrFxRuleLoaderTest | |
13 | + { | |
14 | + [Test] | |
15 | + public void TestLoadDrFxRulesFromStream() | |
16 | + { | |
17 | + const string contents = | |
18 | + @"<?xml version=""1.0"" encoding=""utf-8"" ?>" + | |
19 | + @"<Rules>" + | |
20 | + @" <Rule CheckId=""CA0000"" Category=""Category1"">" + | |
21 | + @" <Name>Name1</Name>" + | |
22 | + @" <Resolution>" + | |
23 | + @" <Content>Content1</Content>" + | |
24 | + @" <Pattern>Pattern1</Pattern>" + | |
25 | + @" </Resolution>" + | |
26 | + @" <Resolution>" + | |
27 | + @" <Content>Content2</Content>" + | |
28 | + @" <Pattern>Pattern2</Pattern>" + | |
29 | + @" </Resolution>" + | |
30 | + @" </Rule>" + | |
31 | + @"</Rules>"; | |
32 | + | |
33 | + Stream stream = StreamGenerator.GenerateWith(contents); | |
34 | + List<DrFxRule> rules = new List<DrFxRule>(DrFxRuleLoader.Load(stream)); | |
35 | + | |
36 | + Assert.AreEqual(1, rules.Count); | |
37 | + DrFxRule rule = rules[0]; | |
38 | + Assert.AreEqual("CA0000", rule.CheckId); | |
39 | + Assert.AreEqual("Category1", rule.Category); | |
40 | + Assert.AreEqual("Name1", rule.Name); | |
41 | + | |
42 | + List<Resolution> resolutions = new List<Resolution>(rule.Resolutions); | |
43 | + Assert.AreEqual(2, resolutions.Count); | |
44 | + Assert.AreEqual("Content1", rule.Resolutions[0].Content); | |
45 | + Assert.AreEqual("Pattern1", rule.Resolutions[0].Pattern); | |
46 | + Assert.AreEqual("Content2", rule.Resolutions[1].Content); | |
47 | + Assert.AreEqual("Pattern2", rule.Resolutions[1].Pattern); | |
48 | + } | |
49 | + } | |
50 | +} |
@@ -1,7 +1,9 @@ | ||
1 | 1 | using NUnit.Framework; |
2 | +using Sasa.QualityTools.DrFx.Core.Tests.Unit.TestingUtilities; | |
2 | 3 | using Sasa.QualityTools.DrFx.Core.Translation; |
3 | 4 | using System; |
4 | 5 | using System.Collections.Generic; |
6 | +using System.IO; | |
5 | 7 | using System.Xml; |
6 | 8 | |
7 | 9 | namespace Sasa.QualityTools.DrFx.Core.Tests.Unit.Translation |
@@ -41,7 +43,9 @@ | ||
41 | 43 | @"</Rules>"; |
42 | 44 | |
43 | 45 | Translator translator = new Translator(); |
44 | - translator.AddRules(DrFxRule.Parse(ruleContents)); | |
46 | + Stream stream = StreamGenerator.GenerateWith(ruleContents); | |
47 | + translator.AddRules(DrFxRuleLoader.Load(stream)); | |
48 | + | |
45 | 49 | return translator.TranslateIssue(category, checkId, issue); |
46 | 50 | } |
47 | 51 |
@@ -88,8 +92,11 @@ | ||
88 | 92 | @" </Rules>" + "\r\n" + |
89 | 93 | @"</FxCopReport>"; |
90 | 94 | |
95 | + | |
91 | 96 | Translator translator = new Translator(); |
92 | - translator.AddRules(DrFxRule.Parse(ruleContents)); | |
97 | + Stream stream = StreamGenerator.GenerateWith(ruleContents); | |
98 | + translator.AddRules(DrFxRuleLoader.Load(stream)); | |
99 | + | |
93 | 100 | Assert.AreEqual(expected, translator.Translate(reportContents)); |
94 | 101 | } |
95 | 102 |
@@ -47,14 +47,7 @@ | ||
47 | 47 | |
48 | 48 | public void Translate(IEnumerable<FxCopRule> rules) |
49 | 49 | { |
50 | - // TODO: 再検討 | |
51 | - List<DrFxRule> translationRules = new List<DrFxRule>(); | |
52 | - string directory = Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), "Resources"); | |
53 | - foreach (string file in Directory.GetFiles(directory, "*.xml")) | |
54 | - { | |
55 | - string rule = File.ReadAllText(file); | |
56 | - translationRules.AddRange(DrFxRule.Parse(rule)); | |
57 | - } | |
50 | + List<DrFxRule> translationRules = new List<DrFxRule>(DrFxRuleLoader.Load()); | |
58 | 51 | var lookup = translationRules.ToLookup(r => r.CheckId); |
59 | 52 | |
60 | 53 | foreach (FxCopRule rule in rules) |
@@ -41,12 +41,7 @@ | ||
41 | 41 | internal Program() |
42 | 42 | { |
43 | 43 | this.translator = new Translator(); |
44 | - string directory = Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), "Resources"); | |
45 | - foreach (string file in Directory.GetFiles(directory, "*.xml")) | |
46 | - { | |
47 | - string rule = File.ReadAllText(file); | |
48 | - this.translator.AddRules(DrFxRule.Parse(rule)); | |
49 | - } | |
44 | + this.translator.AddRules(DrFxRuleLoader.Load()); | |
50 | 45 | } |
51 | 46 | |
52 | 47 |
@@ -42,17 +42,17 @@ | ||
42 | 42 | /// <summary> |
43 | 43 | /// FxCop ルールのチェック ID。 |
44 | 44 | /// </summary> |
45 | - public string CheckId { get; private set; } | |
45 | + public string CheckId { get; set; } | |
46 | 46 | |
47 | 47 | /// <summary> |
48 | 48 | /// FxCop ルールのカテゴリ。 |
49 | 49 | /// </summary> |
50 | - public string Category { get; private set; } | |
50 | + public string Category { get; set; } | |
51 | 51 | |
52 | 52 | /// <summary> |
53 | 53 | /// FxCop ルール名。 |
54 | 54 | /// </summary> |
55 | - public string Name { get; private set; } | |
55 | + public string Name { get; set; } | |
56 | 56 | |
57 | 57 | /// <summary> |
58 | 58 | /// ルール違反の解決方法を表すオブジェクトのコレクション。 |
@@ -70,49 +70,9 @@ | ||
70 | 70 | /// <summary> |
71 | 71 | /// 新しいインスタンスを初期化します。 |
72 | 72 | /// </summary> |
73 | - private DrFxRule() | |
73 | + public DrFxRule() | |
74 | 74 | { |
75 | 75 | this.resolutions = new List<Resolution>(); |
76 | 76 | } |
77 | - | |
78 | - | |
79 | - | |
80 | - /// <summary> | |
81 | - /// 翻訳ルールコンテンツを解析し、翻訳ルールコレクションを作成します。 | |
82 | - /// </summary> | |
83 | - /// <param name="content">翻訳ルールコンテンツ。</param> | |
84 | - /// <returns>翻訳ルールコレクション。</returns> | |
85 | - public static IEnumerable<DrFxRule> Parse(string content) | |
86 | - { | |
87 | - List<DrFxRule> rules = new List<DrFxRule>(); | |
88 | - XmlDocument doc = new XmlDocument(); | |
89 | - doc.LoadXml(content); | |
90 | - foreach (XmlNode node in doc.SelectNodes("/Rules/Rule")) | |
91 | - { | |
92 | - DrFxRule rule = new DrFxRule(); | |
93 | - rule.CheckId = node.Attributes["CheckId"].Value; | |
94 | - rule.Category = node.Attributes["Category"].Value; | |
95 | - rule.Name = node["Name"].InnerText; | |
96 | - rule.ParseResolutions(node); | |
97 | - rules.Add(rule); | |
98 | - } | |
99 | - return rules; | |
100 | - } | |
101 | - | |
102 | - /// <summary> | |
103 | - /// 指定された Rule ノードを解析し、ルール違反の解決方法を表すオブジェクトを生成して、 | |
104 | - /// フィールドで保持します。 | |
105 | - /// </summary> | |
106 | - /// <param name="ruleNode">解析対象の Rule ノード。</param> | |
107 | - private void ParseResolutions(XmlNode ruleNode) | |
108 | - { | |
109 | - foreach (XmlNode node in ruleNode.SelectNodes("Resolution")) | |
110 | - { | |
111 | - Resolution resolution = new Resolution(); | |
112 | - resolution.Content = node["Content"].InnerText; | |
113 | - resolution.Pattern = node["Pattern"].InnerText; | |
114 | - this.resolutions.Add(resolution); | |
115 | - } | |
116 | - } | |
117 | 77 | } |
118 | 78 | } |
@@ -32,28 +32,47 @@ | ||
32 | 32 | |
33 | 33 | |
34 | 34 | /// <summary> |
35 | - /// 翻訳ルールコンテンツを解析し、翻訳ルールコレクションを作成します。 | |
35 | + /// アセンブリに埋め込まれている翻訳ルールコンテンツを解析し、翻訳ルールコレクションを作成します。 | |
36 | 36 | /// </summary> |
37 | - /// <param name="content">翻訳ルールコンテンツ。</param> | |
38 | 37 | /// <returns>翻訳ルールコレクション。</returns> |
39 | 38 | public static IEnumerable<DrFxRule> Load() |
40 | 39 | { |
40 | + using (Stream stream = typeof(DrFxRuleLoader).Assembly.GetManifestResourceStream(resourceName)) | |
41 | + { | |
42 | + return Load(stream); | |
43 | + } | |
44 | + } | |
45 | + | |
46 | + /// <summary> | |
47 | + /// 指定されたストリームから翻訳ルールコンテンツを読み込んで解析し、翻訳ルールコレクションを作成します。 | |
48 | + /// </summary> | |
49 | + /// <param name="stream">翻訳ルールコンテンツ読み込み用ストリーム。</param> | |
50 | + /// <returns>翻訳ルールコレクション。</returns> | |
51 | + internal static IEnumerable<DrFxRule> Load(Stream stream) | |
52 | + { | |
41 | 53 | List<DrFxRule> rules = new List<DrFxRule>(); |
54 | + | |
42 | 55 | XmlDocument doc = new XmlDocument(); |
56 | + doc.Load(stream); | |
43 | 57 | |
44 | - using (Stream stream = typeof(DrFxRuleLoader).Assembly.GetManifestResourceStream(resourceName)) | |
58 | + foreach (XmlNode ruleNode in doc.SelectNodes("/Rules/Rule")) | |
45 | 59 | { |
46 | - doc.Load(stream); | |
47 | - //foreach (XmlNode node in doc.SelectNodes("/Rules/Rule")) | |
48 | - //{ | |
49 | - // TranslationRule rule = new TranslationRule(); | |
50 | - // rule.CheckId = node.Attributes["CheckId"].Value; | |
51 | - // rule.Category = node.Attributes["Category"].Value; | |
52 | - // rule.Name = node["Name"].InnerText; | |
53 | - // rule.ParseResolutions(node); | |
54 | - // rules.Add(rule); | |
55 | - //} | |
60 | + DrFxRule rule = new DrFxRule(); | |
61 | + rule.CheckId = ruleNode.Attributes["CheckId"].Value; | |
62 | + rule.Category = ruleNode.Attributes["Category"].Value; | |
63 | + rule.Name = ruleNode["Name"].InnerText; | |
64 | + | |
65 | + foreach (XmlNode resolutionNode in ruleNode.SelectNodes("Resolution")) | |
66 | + { | |
67 | + Resolution resolution = new Resolution(); | |
68 | + resolution.Content = resolutionNode["Content"].InnerText; | |
69 | + resolution.Pattern = resolutionNode["Pattern"].InnerText; | |
70 | + rule.Resolutions.Add(resolution); | |
71 | + } | |
72 | + | |
73 | + rules.Add(rule); | |
56 | 74 | } |
75 | + | |
57 | 76 | return rules; |
58 | 77 | } |
59 | 78 | } |