/* * Copyright (c) 2023 Proton AG * * This file is part of ProtonVPN. * * ProtonVPN is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ProtonVPN is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ProtonVPN. If not, see . */ using System; using System.Collections.Generic; using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; using ProtonVPN.Common.Core.Extensions; namespace ProtonVPN.Common.Tests.Extensions { [TestClass] public class StringExtensionsTest { [TestMethod] [DataRow(false, "false")] [DataRow(false, "FALSE")] [DataRow(true, "true")] [DataRow(true, "TRUE")] [DataRow(null, null)] [DataRow(null, "")] [DataRow(null, " ")] [DataRow(null, "0")] [DataRow(null, "1")] [DataRow(null, "falso")] public void TestToBoolOrNull(bool? expectedResult, string input) { bool? result = StringExtensions.ToBoolOrNull(input); Assert.AreEqual(expectedResult, result); } [TestMethod] [DataRow(null)] [DataRow("")] [DataRow(" ")] public void TestSplitToEnumerable_ReturnsNull(string input) { IEnumerable result = StringExtensions.SplitToEnumerable(input, '.'); Assert.IsNull(result); } [TestMethod] [DataRow(',')] [DataRow(';')] [DataRow('.')] [DataRow(':')] [DataRow('-')] public void TestSplitToEnumerable_ForOne(char separator) { string input = "protonvpn"; List expectedResult = new() { input }; IEnumerable result = StringExtensions.SplitToEnumerable(input, separator); AssertEnumerable(expectedResult, result); } private void AssertEnumerable(IEnumerable expectedResult, IEnumerable result) { if (expectedResult is null) { Assert.IsNull(result); } else { Assert.IsNotNull(result); Assert.AreEqual(expectedResult.Count(), result.Count()); IEnumerator expectedEnumerator = expectedResult.GetEnumerator(); IEnumerator enumerator = result.GetEnumerator(); while (expectedEnumerator.MoveNext() && enumerator.MoveNext()) { Assert.AreEqual(expectedEnumerator.Current, enumerator.Current); } } } [TestMethod] [DataRow(',')] [DataRow(';')] [DataRow('.')] [DataRow(':')] [DataRow('-')] public void TestSplitToEnumerable_ForMultiple(char separator) { string input = $" inbox {separator} VPN {separator} Calendar {separator} Drive {separator} 9455"; List expectedResult = new() { "inbox", "VPN", "Calendar", "Drive", "9455" }; IEnumerable result = StringExtensions.SplitToEnumerable(input, separator); AssertEnumerable(expectedResult, result); } [TestMethod] [DataRow(null)] [DataRow("")] [DataRow(" ")] public void TestSplitToHashSet_ReturnsNull(string input) { HashSet result = StringExtensions.SplitToHashSet(input, '.'); Assert.IsNull(result); } [TestMethod] [DataRow(',')] [DataRow(';')] [DataRow('.')] [DataRow(':')] [DataRow('-')] public void TestSplitToHashSet_ForOne(char separator) { string input = "protonvpn"; HashSet expectedResult = new() { input }; HashSet result = StringExtensions.SplitToHashSet(input, separator); AssertEnumerable(expectedResult, result); } [TestMethod] [DataRow(',')] [DataRow(';')] [DataRow('.')] [DataRow(':')] [DataRow('-')] public void TestSplitToHashSet_ForMultiple(char separator) { string input = $" inbox {separator} VPN {separator} Calendar {separator} Drive {separator} 9455"; HashSet expectedResult = new() { "inbox", "VPN", "Calendar", "Drive", "9455" }; HashSet result = StringExtensions.SplitToHashSet(input, separator); AssertEnumerable(expectedResult, result); } [TestMethod] [DataRow(null)] [DataRow("")] [DataRow(" ")] public void TestSplitToList_ReturnsNull(string input) { List result = StringExtensions.SplitToList(input, '.'); Assert.IsNull(result); } [TestMethod] [DataRow(',')] [DataRow(';')] [DataRow('.')] [DataRow(':')] [DataRow('-')] public void TestSplitToList_ForOne(char separator) { string input = "protonvpn"; List expectedResult = new() { input }; List result = StringExtensions.SplitToList(input, separator); AssertEnumerable(expectedResult, result); } [TestMethod] [DataRow(',')] [DataRow(';')] [DataRow('.')] [DataRow(':')] [DataRow('-')] public void TestSplitToList_ForMultiple(char separator) { string input = $" inbox {separator} VPN {separator} Calendar {separator} Drive {separator} 9455"; List expectedResult = new() { "inbox", "VPN", "Calendar", "Drive", "9455" }; List result = StringExtensions.SplitToList(input, separator); AssertEnumerable(expectedResult, result); } [TestMethod] [DataRow("https://192.168.1.1/", "192.168.1.1")] [DataRow("https://protonvpn.com/", "protonvpn.com")] [DataRow("http://protonvpn.com/", "http://protonvpn.com")] [DataRow("https://account.proton.me/", "account.proton.me")] [DataRow("https://account.proton.me/switch", "https://account.proton.me/switch")] public void TestIsHttpUri(string expectedUriString, string input) { bool isUri = StringExtensions.IsHttpUri(input, out Uri uri); Assert.IsTrue(isUri); Assert.IsNotNull(uri); Assert.AreEqual(expectedUriString, uri.AbsoluteUri); } [TestMethod] [DataRow(null)] [DataRow("")] [DataRow(" ")] [DataRow(".")] public void TestIsHttpUri_ReturnsFalse(string input) { bool isUri = StringExtensions.IsHttpUri(input, out Uri uri); Assert.IsFalse(isUri); } [TestMethod] [DataRow("email@domain.com")] [DataRow("joe.smith@domain.com")] [DataRow("email@subdomain.domain.com")] [DataRow("joe+smith@domain.com")] [DataRow("joe-smith@domain.com")] [DataRow("email@123.123.123.123")] [DataRow("email@[123.123.123.123]")] [DataRow("\"email\"@domain.com")] [DataRow("1234567890@domain.com")] [DataRow("email@domain-a.com")] [DataRow("_@domain.com")] public void TestIsValidEmailAddress(string email) { bool isValid = StringExtensions.IsValidEmailAddress(email); Assert.IsTrue(isValid); } [TestMethod] [DataRow(null)] [DataRow("")] [DataRow(" ")] [DataRow(".")] [DataRow("@")] [DataRow("@.")] [DataRow("email")] [DataRow("^%#$@#$#@%@#.com")] [DataRow("@domain.com")] [DataRow("email@.com")] [DataRow("email@domain.")] [DataRow("Joe Smith ")] [DataRow("email.domain.com")] [DataRow("email@domain@domain.com")] [DataRow("joe..smith@domain.com ")] [DataRow("email@domain.com (Joe Smith)")] public void TestIsValidEmailAddress_ReturnsFalse(string email) { bool isValid = StringExtensions.IsValidEmailAddress(email); Assert.IsFalse(isValid); } [TestMethod] [DataRow("Ålesund", "Alesund")] [DataRow("Bergen", "Bergen")] [DataRow("Bío-Bío", "Bio-Bio")] [DataRow("Bogotá", "Bogota")] [DataRow("Brăila", "Braila")] [DataRow("Córdoba", "Cordoba")] [DataRow("České Budějovice", "Ceske Budejovice")] [DataRow("Český Krumlov", "Cesky Krumlov")] [DataRow("Děčín", "Decin")] [DataRow("Düsseldorf", "Dusseldorf")] [DataRow("Évian-les-Bains", "Evian-les-Bains")] [DataRow("Færøyene", "Faeroyene")] [DataRow("Göreme", "Goreme")] [DataRow("Göteborg", "Goteborg")] [DataRow("Jökulsárlón", "Jokulsarlon")] [DataRow("Kraków", "Krakow")] [DataRow("León", "Leon")] [DataRow("Ljubljana", "Ljubljana")] [DataRow("Łódź", "Lodz")] [DataRow("Málaga", "Malaga")] [DataRow("Montaña", "Montana")] [DataRow("München", "Munchen")] [DataRow("Mývatn", "Myvatn")] [DataRow("Nürnberg", "Nurnberg")] [DataRow("Río de Janeiro", "Rio de Janeiro")] [DataRow("Rūdninkai", "Rudninkai")] [DataRow("São Paulo", "Sao Paulo")] [DataRow("Şanlıurfa", "Sanliurfa")] [DataRow("Smørrebrød", "Smorrebrod")] [DataRow("Timișoara", "Timisoara")] [DataRow("Tórshavn", "Torshavn")] [DataRow("Tromsø", "Tromso")] [DataRow("Türkiye", "Turkiye")] [DataRow("Viña del Mar", "Vina del Mar")] [DataRow("Zürich", "Zurich")] [DataRow("Žilina", "Zilina")] [DataRow("Øresund", "Oresund")] [DataRow("Île-de-France", "Ile-de-France")] [DataRow("Réunion", "Reunion")] public void TestRemoveDiacritics(string value, string expectedValue) { Assert.AreEqual(expectedValue, value.RemoveDiacritics()); } } }