OSDN Git Service

強制帰投中の遠征タイマーをマイナスにする
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / ShipLabelTest.cs
index f9fb476..8283f41 100644 (file)
 // See the License for the specific language governing permissions and\r
 // limitations under the License.\r
 \r
+using System;\r
 using System.Collections.Generic;\r
+using System.Drawing;\r
+using System.Reflection;\r
 using System.Windows.Forms;\r
 using ExpressionToCodeLib;\r
+using KancolleSniffer.Model;\r
+using KancolleSniffer.View;\r
 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
 \r
 namespace KancolleSniffer.Test\r
@@ -22,115 +27,312 @@ namespace KancolleSniffer.Test
     [TestClass]\r
     public class ShipLabelTest\r
     {\r
-        /// <summary>\r
-        /// 明石タイマー表示中の艦娘の名前を縮める\r
-        /// </summary>\r
-        [TestMethod]\r
-        public void TruncateNameForAkashiTimer()\r
+        [TestClass]\r
+        public class TruncateTest\r
         {\r
-            var dict = new Dictionary<string, string>\r
+            private class TestData : Dictionary<int, Pair[]>\r
             {\r
-                {"夕立改二", "夕立改二"},\r
-                {"千代田航改", "千代田航"},\r
-                {"千代田航改二", "千代田航"},\r
-                {"Bismarck改", "Bismarck"},\r
-                {"Bismarck twei", "Bismarck"},\r
-                {"Bismarck drei", "Bismarck"},\r
-                {"Prinz Eugen", "Prinz Eug"},\r
-                {"Prinz Eugen改", "Prinz Eug"},\r
-                {"Graf Zeppelin", "Graf Zep"},\r
-                {"Graf Zeppelin改", "Graf Zep"},\r
-                {"Libeccio改", "Libeccio"},\r
-            };\r
-            TruncateNameSub(dict, ShipNameWidth.AkashiTimer);\r
-        }\r
+            }\r
 \r
-        /// <summary>\r
-        /// 入渠中の艦娘名の名前を縮める\r
-        /// </summary>\r
-        [TestMethod]\r
-        public void TruncateNameForNDock()\r
-        {\r
-            var dict = new Dictionary<string, string>\r
+            private class Pair\r
             {\r
-                {"千歳航改二", "千歳航改二"},\r
-                {"Graf Zeppelin", "Graf Zeppeli"},\r
-                {"Graf Zeppelin改", "Graf Zeppeli"},\r
-                {"千代田航改二", "千代田航改"}\r
-            };\r
-            TruncateNameSub(dict, ShipNameWidth.NDock);\r
+                public readonly string Origin;\r
+                public readonly string Result;\r
+\r
+                public Pair()\r
+                {\r
+                    Origin = "";\r
+                    Result = "";\r
+                }\r
+\r
+                public Pair(string origin, string result)\r
+                {\r
+                    Origin = origin;\r
+                    Result = result;\r
+                }\r
+            }\r
+\r
+            /// <summary>\r
+            /// 文字数制限がない\r
+            /// </summary>\r
+            [TestMethod]\r
+            public void Unlimited()\r
+            {\r
+                var label = new ShipLabel.Name(Point.Empty, ShipNameWidth.Max){Parent = new Panel()};\r
+                var str = "一二三四五六七八九〇一二三四五六七八九〇一二三四五六七八九〇";\r
+                label.SetName(str);\r
+                Assert.AreEqual(str, label.Text);\r
+            }\r
+\r
+            /// <summary>\r
+            /// 明石タイマー表示中の艦娘の名前を縮める\r
+            /// </summary>\r
+            [TestMethod]\r
+            public void ForAkashiTimer()\r
+            {\r
+                var data = new TestData\r
+                {\r
+                    {\r
+                        100,\r
+                        new[]\r
+                        {\r
+                            new Pair("夕立改二", "夕立改二"),\r
+                            new Pair("千代田航改", "千代田航"),\r
+                            new Pair("千代田航改二", "千代田航"),\r
+                            new Pair("Bismarck改", "Bismarck"),\r
+                            new Pair("Bismarck zwei", "Bismarck"),\r
+                            new Pair("Bismarck drei", "Bismarck"),\r
+                            new Pair("Prinz Eugen", "Prinz Eug"),\r
+                            new Pair("Prinz Eugen改", "Prinz Eug"),\r
+                            new Pair("Graf Zeppelin", "Graf Zep"),\r
+                            new Pair("Graf Zeppelin改", "Graf Zep"),\r
+                            new Pair("Libeccio改", "Libeccio")\r
+                        }\r
+                    },\r
+                    {\r
+                        125,\r
+                        new[]\r
+                        {\r
+                            new Pair(),\r
+                            new Pair(),\r
+                            new Pair(),\r
+                            new Pair(),\r
+                            new Pair(),\r
+                            new Pair(),\r
+                            new Pair(),\r
+                            new Pair(),\r
+                            new Pair("Graf Zeppelin", "Graf Zepp"),\r
+                            new Pair("Graf Zeppelin改", "Graf Zepp"),\r
+                            new Pair("Libeccio改", "Libeccio改")\r
+                        }\r
+                    }\r
+                };\r
+                TestTruncate(data, ShipNameWidth.AkashiTimer);\r
+            }\r
+\r
+            /// <summary>\r
+            /// 入渠中の艦娘名の名前を縮める\r
+            /// </summary>\r
+            [TestMethod]\r
+            public void ForNDock()\r
+            {\r
+                var data = new TestData\r
+                {\r
+                    {\r
+                        100, new[]\r
+                        {\r
+                            new Pair("千歳航改二", "千歳航改二"),\r
+                            new Pair("千代田航改二", "千代田航改"),\r
+                            new Pair("Graf Zeppelin", "Graf Zeppeli"),\r
+                            new Pair("Graf Zeppelin改", "Graf Zeppeli")\r
+                        }\r
+                    },\r
+                    {\r
+                        125, new[]\r
+                        {\r
+                            new Pair(),\r
+                            new Pair(),\r
+                            new Pair("Graf Zeppelin", "Graf Zeppelin"),\r
+                            new Pair("Graf Zeppelin改", "Graf Zeppelin")\r
+                        }\r
+                    }\r
+                };\r
+                TestTruncate(data, ShipNameWidth.NDock);\r
+            }\r
+\r
+            /// <summary>\r
+            /// 一覧ウィンドウの要修復一覧の艦娘の名前を縮める\r
+            /// </summary>\r
+            [TestMethod]\r
+            public void ForRepairListFull()\r
+            {\r
+                var data = new TestData\r
+                {\r
+                    {\r
+                        100,\r
+                        new[]\r
+                        {\r
+                            new Pair("Graf Zeppelin", "Graf Zeppelin"),\r
+                            new Pair("Graf Zeppelin改", "Graf Zeppelin"),\r
+                            new Pair("千代田航改二", "千代田航改")\r
+                        }\r
+                    },\r
+                    {\r
+                        125,\r
+                        new[]\r
+                        {\r
+                            new Pair(),\r
+                            new Pair(),\r
+                            new Pair("千代田航改二", "千代田航改二")\r
+                        }\r
+                    }\r
+                };\r
+                TestTruncate(data, ShipNameWidth.RepairListFull);\r
+            }\r
+\r
+            /// <summary>\r
+            /// メインパネルの艦娘の名前を縮める\r
+            /// </summary>\r
+            [TestMethod]\r
+            public void ForMainPanel()\r
+            {\r
+                var data = new TestData\r
+                {\r
+                    {\r
+                        100,\r
+                        new[]\r
+                        {\r
+                            new Pair("Commandant Teste", "Commandant Tes")\r
+                        }\r
+                    },\r
+                    {\r
+                        125,\r
+                        new[]\r
+                        {\r
+                            new Pair("Commandant Teste", "Commandant Test")\r
+                        }\r
+                    }\r
+                };\r
+                TestTruncate(data, ShipNameWidth.MainPanel);\r
+            }\r
+\r
+            /// <summary>\r
+            /// 一覧ウィンドウの艦娘一覧の名前を縮める\r
+            /// </summary>\r
+            [TestMethod]\r
+            public void ForShipList()\r
+            {\r
+                var data = new TestData\r
+                {\r
+                    {\r
+                        100,\r
+                        new[]\r
+                        {\r
+                            new Pair("Commandant Teste", "Commandant T"),\r
+                            new Pair("Graf Zeppelin改", "Graf Zeppelin")\r
+                        }\r
+                    },\r
+                    {\r
+                        125,\r
+                        new[]\r
+                        {\r
+                            new Pair(),\r
+                            new Pair("Graf Zeppelin改", "Graf Zeppelin改")\r
+                        }\r
+                    }\r
+                };\r
+                TestTruncate(data, ShipNameWidth.ShipList);\r
+            }\r
+\r
+            private static void TestTruncate(TestData data, ShipNameWidth width)\r
+            {\r
+                foreach (var zoom in data.Keys)\r
+                {\r
+                    SetScaleFactor(zoom);\r
+                    var label = new ShipLabel.Name(Point.Empty, width) {Font = ShipLabel.Name.BaseFont};\r
+                    for (var i = 0; i < data[zoom].Length; i++)\r
+                    {\r
+                        var entry = data[zoom][i];\r
+                        if (string.IsNullOrEmpty(entry.Origin))\r
+                            entry = data[100][i];\r
+                        label.SetName(entry.Origin);\r
+                        Assert.AreEqual(entry.Result, label.Text, $"{entry.Origin}: scale {zoom}");\r
+                    }\r
+                }\r
+            }\r
+\r
+            private static void SetScaleFactor(int zoom)\r
+            {\r
+                var form = new Form {AutoScaleMode = AutoScaleMode.Font};\r
+                if (zoom == 100)\r
+                {\r
+                    Scaler.Factor = new SizeF(1, 1);\r
+                    ShipLabel.Name.BaseFont = form.Font;\r
+                    ShipLabel.Name.LatinFont = LatinFont(100);\r
+                    return;\r
+                }\r
+                var prev = form.CurrentAutoScaleDimensions;\r
+                form.Font = new Font(form.Font.FontFamily, form.Font.Size * zoom / 100);\r
+                ShipLabel.Name.BaseFont = form.Font;\r
+                ShipLabel.Name.LatinFont = LatinFont(zoom);\r
+                var cur = form.CurrentAutoScaleDimensions;\r
+                Scaler.Factor = new SizeF(cur.Width / prev.Width, cur.Height / prev.Height);\r
+            }\r
+\r
+            private static Font LatinFont(int zoom)\r
+            {\r
+                return new Font("Tahoma", 8f * zoom / 100);\r
+            }\r
         }\r
 \r
         /// <summary>\r
-        /// 一覧ウィンドウの要修復一覧の艦娘の名前を縮め\r
+        /// prefixを加え\r
         /// </summary>\r
         [TestMethod]\r
-        public void TruncateNameForRepairListFull()\r
+        public void SetName()\r
         {\r
-            var dict = new Dictionary<string, string>\r
+            var label = new ShipLabel.Name(Point.Empty, ShipNameWidth.AkashiTimer) {Parent = new Panel()};\r
+            Scaler.Factor = new SizeF(1, 1);\r
+            label.Set(new ShipStatus\r
             {\r
-                {"Graf Zeppelin", "Graf Zeppelin"},\r
-                {"Graf Zeppelin改", "Graf Zeppelin"},\r
-                {"千代田航改二", "千代田航改"}\r
-            };\r
-            TruncateNameSub(dict, ShipNameWidth.RepairListFull);\r
+                Spec = new ShipSpec {Name = "綾波改二"},\r
+                Escaped = true\r
+            });\r
+            PAssert.That(() => label.Text == "[避]綾波改二");\r
+            label.Set(new ShipStatus\r
+            {\r
+                Spec = new ShipSpec {Name = "朝潮改二丁"},\r
+                Escaped = true\r
+            });\r
+            PAssert.That(() => label.Text == "[避]朝潮改二");\r
         }\r
 \r
         /// <summary>\r
-        /// メインパネルの艦娘の名前を縮め\r
+        /// %表示の小数部を切り捨て\r
         /// </summary>\r
         [TestMethod]\r
-        public void TruncateNameForMainPanel()\r
+        public void RoundOffFractionOfPercent()\r
         {\r
-            var dict = new Dictionary<string, string>\r
-            {\r
-                {"Commandant Teste", "Commandant Tes"}\r
-            };\r
-            TruncateNameSub(dict, ShipNameWidth.MainPanel);\r
+            var label = new ShipLabel.Hp {Parent = new Panel()};\r
+            label.SetHp(104, 105);\r
+            label.ToggleHpPercent();\r
+            PAssert.That(() => label.Text == "99%");\r
         }\r
 \r
+\r
+        /// <summary>\r
+        /// 装備スロットの状況を調べる\r
+        /// </summary>\r
         [TestMethod]\r
-        public void TruncateNameForShipList()\r
+        public void SlotStatus()\r
         {\r
-            var dict = new Dictionary<string, string>\r
+            var ship = new ShipStatus\r
             {\r
-                {"Commandant Test", "Commandant T"},\r
-                {"Graf Zeppelin改", "Graf Zeppelin"}\r
+                Id = 1,\r
+                Slot = new[] {new ItemStatus(), new ItemStatus(), new ItemStatus()}, SlotEx = new ItemStatus(0),\r
+                Spec = new ShipSpec {SlotNum = 3}\r
             };\r
-            TruncateNameSub(dict, ShipNameWidth.ShipList);\r
-        }\r
-\r
-        private void TruncateNameSub(Dictionary<string, string> dict, ShipNameWidth width)\r
-        {\r
-            var label = new ShipLabel {Parent = new Panel()};\r
-            foreach (var entry in dict)\r
-            {\r
-                label.SetName(entry.Key, width);\r
-                PAssert.That(() => label.Text == entry.Value, entry.Key);\r
-            }\r
+            Assert.AreEqual(2, GetSlotStatus(ship)); // NormalEmpty\r
+            ship.SlotEx.Id = -1;\r
+            Assert.AreEqual(2 | 4, GetSlotStatus(ship)); // | ExtraEmpty\r
+            ship.SlotEx.Id = 1;\r
+            Assert.AreEqual(2, GetSlotStatus(ship)); // NormalEmpty\r
+            ship.Slot[0].Id = ship.Slot[1].Id = ship.Slot[2].Id = 1;\r
+            Assert.AreEqual(0, GetSlotStatus(ship)); // Equipped\r
+            ship.Slot[2].Id = -1;\r
+            Assert.AreEqual(1, GetSlotStatus(ship)); // SemiEquipped\r
+            ship.Spec.SlotNum = 2;\r
+            Assert.AreEqual(0, GetSlotStatus(ship)); // Equipped\r
+            ship.Spec.SlotNum = 0;\r
+            Assert.AreEqual(0, GetSlotStatus(ship)); // Equipped (まるゆ)\r
         }\r
 \r
-        /// <summary>\r
-        /// prefixを加える\r
-        /// </summary>\r
-        [TestMethod]\r
-        public void SetName()\r
+        private static int GetSlotStatus(ShipStatus ship)\r
         {\r
-            var label = new ShipLabel {Parent = new Panel()};\r
-            label.SetName(new ShipStatus\r
-                {\r
-                    Spec = new ShipSpec {Name = "綾波改二"},\r
-                    Escaped = true\r
-                },\r
-                ShipNameWidth.AkashiTimer);\r
-            PAssert.That(() => label.Text == "[避]綾波改二");\r
-            label.SetName(new ShipStatus\r
-                {\r
-                    Spec = new ShipSpec {Name = "朝潮改二丁"},\r
-                    Escaped = true\r
-                },\r
-                ShipNameWidth.AkashiTimer);\r
-            PAssert.That(() => label.Text == "[避]朝潮改二");\r
+            var method =\r
+                typeof(ShipLabel.Name).GetMethod("GetSlotStatus", BindingFlags.NonPublic | BindingFlags.Static);\r
+            // ReSharper disable once PossibleNullReferenceException\r
+            return (int)Convert.ChangeType(method.Invoke(null, new object[] {ship}), TypeCode.Int32);\r
         }\r
     }\r
 }
\ No newline at end of file