// // This tests excercises a number of switch things: // // Code to test for multiple-labels is different that // code for a single label. // // Code for switching on strings is different from the integer // code. // // nulls (for strings) need to be handled specially since ceq will // throw an exception if there. // // null as a case statement needs to be caught specially // using System; class X { enum A { a = 23333, } public const string One = "one"; static int s (byte b) { switch (b){ case 0: return 255-0; case 1: return 255-1; case 2: return 255-2; case 3: return 255-3; case 4: return 255-4; case 5: return 255-5; case 6: return 255-6; case 7: return 255-7; case 8: return 255-8; case 9: return 255-9; case 10: return 255-10; case 11: return 255-11; case 12: return 255-12; case 13: return 255-13; case 14: return 255-14; case 15: return 255-15; case 16: return 255-16; case 17: return 255-17; case 18: return 255-18; case 19: return 255-19; case 20: return 255-20; case 21: return 255-21; case 22: return 255-22; case 23: return 255-23; case 24: return 255-24; case 25: return 255-25; case 26: return 255-26; case 27: return 255-27; case 28: return 255-28; case 29: return 255-29; case 30: return 255-30; case 31: return 255-31; case 32: return 255-32; case 33: return 255-33; case 34: return 255-34; case 35: return 255-35; case 36: return 255-36; case 37: return 255-37; case 38: return 255-38; case 39: return 255-39; case 40: return 255-40; case 41: return 255-41; case 42: return 255-42; case 43: return 255-43; case 44: return 255-44; case 45: return 255-45; case 46: return 255-46; case 47: return 255-47; case 48: return 255-48; case 49: return 255-49; case 50: return 255-50; case 51: return 255-51; case 52: return 255-52; case 53: return 255-53; case 54: return 255-54; case 55: return 255-55; case 56: return 255-56; case 57: return 255-57; case 58: return 255-58; case 59: return 255-59; case 60: return 255-60; case 61: return 255-61; case 62: return 255-62; case 63: return 255-63; case 64: return 255-64; case 65: return 255-65; case 66: return 255-66; case 67: return 255-67; case 68: return 255-68; case 69: return 255-69; case 70: return 255-70; case 71: return 255-71; case 72: return 255-72; case 73: return 255-73; case 74: return 255-74; case 75: return 255-75; case 76: return 255-76; case 77: return 255-77; case 78: return 255-78; case 79: return 255-79; case 80: return 255-80; case 81: return 255-81; case 82: return 255-82; case 83: return 255-83; case 84: return 255-84; case 85: return 255-85; case 86: return 255-86; case 87: return 255-87; case 88: return 255-88; case 89: return 255-89; case 90: return 255-90; case 91: return 255-91; case 92: return 255-92; case 93: return 255-93; case 94: return 255-94; case 95: return 255-95; case 96: return 255-96; case 97: return 255-97; case 98: return 255-98; case 99: return 255-99; case 100: return 255-100; case 101: return 255-101; case 102: return 255-102; case 103: return 255-103; case 104: return 255-104; case 105: return 255-105; case 106: return 255-106; case 107: return 255-107; case 108: return 255-108; case 109: return 255-109; case 110: return 255-110; case 111: return 255-111; case 112: return 255-112; case 113: return 255-113; case 114: return 255-114; case 115: return 255-115; case 116: return 255-116; case 117: return 255-117; case 118: return 255-118; case 119: return 255-119; case 120: return 255-120; case 121: return 255-121; case 122: return 255-122; case 123: return 255-123; case 124: return 255-124; case 125: return 255-125; case 126: return 255-126; case 127: return 255-127; case 128: return 255-128; case 129: return 255-129; case 130: return 255-130; case 131: return 255-131; case 132: return 255-132; case 133: return 255-133; case 134: return 255-134; case 135: return 255-135; case 136: return 255-136; case 137: return 255-137; case 138: return 255-138; case 139: return 255-139; case 140: return 255-140; case 141: return 255-141; case 142: return 255-142; case 143: return 255-143; case 144: return 255-144; case 145: return 255-145; case 146: return 255-146; case 147: return 255-147; case 148: return 255-148; case 149: return 255-149; case 150: return 255-150; case 151: return 255-151; case 152: return 255-152; case 153: return 255-153; case 154: return 255-154; case 155: return 255-155; case 156: return 255-156; case 157: return 255-157; case 158: return 255-158; case 159: return 255-159; case 160: return 255-160; case 161: return 255-161; case 162: return 255-162; case 163: return 255-163; case 164: return 255-164; case 165: return 255-165; case 166: return 255-166; case 167: return 255-167; case 168: return 255-168; case 169: return 255-169; case 170: return 255-170; case 171: return 255-171; case 172: return 255-172; case 173: return 255-173; case 174: return 255-174; case 175: return 255-175; case 176: return 255-176; case 177: return 255-177; case 178: return 255-178; case 179: return 255-179; case 180: return 255-180; case 181: return 255-181; case 182: return 255-182; case 183: return 255-183; case 184: return 255-184; case 185: return 255-185; case 186: return 255-186; case 187: return 255-187; case 188: return 255-188; case 189: return 255-189; case 190: return 255-190; case 191: return 255-191; case 192: return 255-192; case 193: return 255-193; case 194: return 255-194; case 195: return 255-195; case 196: return 255-196; case 197: return 255-197; case 198: return 255-198; case 199: return 255-199; case 200: return 255-200; case 201: return 255-201; case 202: return 255-202; case 203: return 255-203; case 204: return 255-204; case 205: return 255-205; case 206: return 255-206; case 207: return 255-207; case 208: return 255-208; case 209: return 255-209; case 210: return 255-210; case 211: return 255-211; case 212: return 255-212; case 213: return 255-213; case 214: return 255-214; case 215: return 255-215; case 216: return 255-216; case 217: return 255-217; case 218: return 255-218; case 219: return 255-219; case 220: return 255-220; case 221: return 255-221; case 222: return 255-222; case 223: return 255-223; case 224: return 255-224; case 225: return 255-225; case 226: return 255-226; case 227: return 255-227; case 228: return 255-228; case 229: return 255-229; case 230: return 255-230; case 231: return 255-231; case 232: return 255-232; case 233: return 255-233; case 234: return 255-234; case 235: return 255-235; case 236: return 255-236; case 237: return 255-237; case 238: return 255-238; case 239: return 255-239; case 240: return 255-240; case 241: return 255-241; case 242: return 255-242; case 243: return 255-243; case 244: return 255-244; case 245: return 255-245; case 246: return 255-246; case 247: return 255-247; case 248: return 255-248; case 249: return 255-249; case 250: return 255-250; case 251: return 255-251; case 252: return 255-252; case 253: return 255-253; case 254: return 255-254; case 255: return 255-255; } return -1; } static int test (int v) { Console.WriteLine ("value: " + v); switch (v){ case 1: case 2: return 1; case 3: return 3; case 4: return 5; default: Console.WriteLine ("default"); return 6; } return 7; } static int tests (string s) { switch (s){ case "one": case "two": return 1; case "three": return 3; case "four": return 5; case null: return 9; case "new": goto case null; default: return 6; } return 1; } static int tests2 (string s) { switch (s){ case "one": goto case null; case "two": goto default; case null: default: return 3; } } static int testn (string s) { switch (s){ case "one": return 1; default: return 0; } return -1; } static int testm (string s) { switch (s){ case "one": return 1; } return 100; } static int testo (string s) { switch (s){ case "one": return 1; case null: return 100; } return 2; } static int testp (string s) { switch (s){ case "one": case null: case "two": return 1; case "three": return 3; } return 4; } static int test_def (string s) { switch (s){ case "one": goto default; case "two": return 1; case "three": return 2; default: return 3; } return 4; } static int test_coverage (int x) { switch (x){ case 0: return 1; default: return 10; } } static int test_goto (int a) { switch (a){ case 0: goto case 2; case 1: return 10; case 2: return 20; default: return 100; } } static int test_memberaccess (string s) { switch (s){ case X.One: return 3; default: return 4; } } static int test_string_multiple_targets (string s) { switch (s){ case "A": return 1; case "B": return 2; case "C": case "D": return 3; } return 0; } enum My : byte { A } static int test_casts (int n) { switch (n) { case (int) (char) (int) My.A: return 1; default: return 2; } } public enum TestEnum : long { a, b, c } public static int testSwitchEnumLong (TestEnum c) { switch (c) { case TestEnum.a: return 10; case TestEnum.b: return 20; case TestEnum.c: goto case TestEnum.b; default: return 40; } } static int test_long_enum_switch () { if (testSwitchEnumLong (TestEnum.a) != 10) return 1; if (testSwitchEnumLong (TestEnum.b) != 20) return 2; if (testSwitchEnumLong (TestEnum.c) != 20) return 3; if (testSwitchEnumLong ((TestEnum)5) != 40) return 4; return 0; } static int tests_default (string s) { // tests default in the middle of the switch switch (s){ default: case "hello": case "world": return 1; case "how": return 2; } } // Bug #74655 static int tests_default_2 (string foo) { switch (foo) { case "Hello": break; default: return 1; case "foo": return 2; case "Monkey": break; } return 3; } static void test_76590 (string s) { switch (s) { case "null": case (string)null: break; case "#": break; default: break; } } static void test_77964() { char c = 'c'; switch (c) { case 'A': break; case 'a': goto case 65; } } static bool bug_78860() { string model = "TSP100"; System.Console.WriteLine("switch on '{0}'", model); switch(model) { case "wibble": case null: return false; case "TSP100": return true; } return false; } static void test_1597 () { var a = ""; switch (a) { } } static int LongStringSwitch (string s) { switch (s) { case "System": case "System.Core": case "System.Data": case "System.Data.DataSetExtensions": case "System.Data.Linq": case "System.Data.OracleClient": case "System.Data.Services": case "System.Data.Services.Client": case "System.IdentityModel": case "System.IdentityModel.Selectors": case "System.Runtime.Remoting": case "System.Runtime.Serialization": case "System.ServiceModel": case "System.Transactions": case "System.Windows.Forms": case "System.Xml": case "System.Xml.Linq": return 1; case "System.Configuration": case "System.Configuration.Install": case "System.Design": case "System.DirectoryServices": case "System.Drawing": case "System.Drawing.Design": case "System.EnterpriseServices": case "System.Management": case "System.Messaging": case "System.Runtime.Serialization.Formatters.Soap": case "System.Security": case "System.ServiceProcess": case "System.Web": case "System.Web.Mobile": case "System.Web.Services": return 2; case "System.ComponentModel.DataAnnotations": case "System.ServiceModel.Web": case "System.Web.Abstractions": case "System.Web.Extensions": case "System.Web.Extensions.Design": case "System.Web.DynamicData": case "System.Web.Routing": return 3; } return 10; } static bool SwitchSingleSection (string scheme) { switch (scheme) { case "http": case "https": case "file": case "ftp": case "nntp": case "gopher": case "mailto": case "news": return true; default: return false; } } public static int Main () { byte b; for (b = 0; b < 255; b++){ if (s (b) != 255 - b){ Console.WriteLine ("Failed with: " + b + " [" + s (b) + "]"); return 1; } } Console.WriteLine ("Batch 2"); if (test (1) != 1) return 1; if (test (2) != 1) return 2; if (test (3) != 3) return 3; if (test (4) != 5) return 4; if (test (100) != 6) return 5; if (tests ("one") != 1) return 6; if (tests ("two") != 1) return 7; if (tests ("three") != 3) return 8; if (tests ("four") != 5) return 9; if (tests (null) != 9) return 10; if (tests ("blah") != 6) return 11; if (tests ("new") != 9) return 110; if (testn ("one") != 1) return 12; if (testn ("hello") != 0) return 13; if (testn (null) != 0) return 14; if (testm ("one") != 1) return 15; if (testm ("two") != 100) return 16; if (testm (null) != 100) return 17; if (testo ("one") != 1) return 18; if (testo ("two") != 2) return 19; if (testo (null) != 100) return 20; if (testp ("one") != 1) return 21; if (testp (null) != 1) return 22; if (testp ("two") != 1) return 23; if (testp ("three") != 3) return 24; if (testp ("blah") != 4) return 25; if (test_def ("one") != 3) return 26; if (test_def ("two") != 1) return 27; if (test_def ("three") != 2) return 28; if (test_def (null) != 3) return 29; if (test_coverage (100) != 10) return 30; if (test_goto (0) != 20) return 31; if (test_goto (1) != 10) return 32; if (test_goto (2) != 20) return 33; if (test_goto (200) != 100) return 34; if (test_memberaccess ("one") != 3) return 35; if (test_string_multiple_targets ("A") != 1) return 36; if (test_string_multiple_targets ("B") != 2) return 37; if (test_string_multiple_targets ("C") != 3) return 38; if (test_string_multiple_targets ("D") != 3) return 39; if (test_string_multiple_targets ("E") != 0) return 40; if (test_casts (0) != 1) return 41; if (test_long_enum_switch () != 0) return 42; if (tests_default (null) != 1) return 43; if (tests_default ("hello") != 1) return 44; if (tests_default ("world") != 1) return 45; if (tests_default ("how") != 2) return 46; if (tests_default_2 ("Test") != 1) return 47; if (tests_default_2 ("foo") != 2) return 48; if (tests_default_2 ("Hello") != 3) return 49; if (tests_default_2 ("Monkey") != 3) return 50; if (!bug_78860 ()) return 60; if (tests2 ("a") != 3) return 71; if (tests2 ("one") != 3) return 72; if (tests2 ("two") != 3) return 73; if (LongStringSwitch ("System.Management") != 2) return 80; if (LongStringSwitch (null) != 10) return 81; if (LongStringSwitch (".") != 10) return 82; if (!SwitchSingleSection ("file")) return 90; if (SwitchSingleSection (null)) return 91; if (SwitchSingleSection ("-=-")) return 92; test_1597 (); Console.WriteLine ("All tests pass"); return 0; } }