From 3549412116c1686eb2be79871593c70dce29d3c3 Mon Sep 17 00:00:00 2001 From: Theodore Tsirpanis Date: Mon, 3 Oct 2022 10:42:25 +0300 Subject: [PATCH] Add tests. --- .../Encoding/ControlFlowBuilderTests.cs | 46 ++++++++++++++++++- .../Encoding/InstructionEncoderTests.cs | 22 +++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Reflection.Metadata/tests/Metadata/Ecma335/Encoding/ControlFlowBuilderTests.cs b/src/libraries/System.Reflection.Metadata/tests/Metadata/Ecma335/Encoding/ControlFlowBuilderTests.cs index 93e3ab418286c..37b7ec13dd193 100644 --- a/src/libraries/System.Reflection.Metadata/tests/Metadata/Ecma335/Encoding/ControlFlowBuilderTests.cs +++ b/src/libraries/System.Reflection.Metadata/tests/Metadata/Ecma335/Encoding/ControlFlowBuilderTests.cs @@ -361,7 +361,7 @@ public void Branch_LongInstruction_LongDistance() AssertEx.Equal(new byte[] { - 0x13, 0x30, 0x08, 0x00, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// header + 0x13, 0x30, 0x08, 0x00, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // header (byte)ILOpCode.Br, 0x04, 0x01, 0x00, 0x00, (byte)ILOpCode.Call, 0x01, 0x00, 0x00, 0x06, (byte)ILOpCode.Call, 0x01, 0x00, 0x00, 0x06, @@ -419,6 +419,50 @@ public void Branch_LongInstruction_LongDistance() }, builder.ToArray()); } + [Fact] + public void Switch() + { + var code = new BlobBuilder(); + var il = new InstructionEncoder(code, new ControlFlowBuilder()); + + var lStart = il.DefineLabel(); + var l1 = il.DefineLabel(); + var l2 = il.DefineLabel(); + var l3 = il.DefineLabel(); + + il.OpCode(ILOpCode.Nop); + il.MarkLabel(lStart); + var switchEncoder = il.Switch(4); + switchEncoder.Branch(l1); + switchEncoder.Branch(l2); + switchEncoder.Branch(l3); + switchEncoder.Branch(lStart); + + il.MarkLabel(l1); + il.OpCode(ILOpCode.Nop); + il.MarkLabel(l2); + il.OpCode(ILOpCode.Nop); + il.MarkLabel(l3); + il.OpCode(ILOpCode.Nop); + + var builder = new BlobBuilder(); + new MethodBodyStreamEncoder(builder).AddMethodBody(il); + + AssertEx.Equal(new byte[] + { + 0x66, // header + (byte)ILOpCode.Nop, + (byte)ILOpCode.Switch, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xeb, 0xff, 0xff, 0xff, + (byte)ILOpCode.Nop, + (byte)ILOpCode.Nop, + (byte)ILOpCode.Nop + }, builder.ToArray()); + } + [Fact] public void Clear() { diff --git a/src/libraries/System.Reflection.Metadata/tests/Metadata/Ecma335/Encoding/InstructionEncoderTests.cs b/src/libraries/System.Reflection.Metadata/tests/Metadata/Ecma335/Encoding/InstructionEncoderTests.cs index 063ad0766ad58..0b85e79472ba9 100644 --- a/src/libraries/System.Reflection.Metadata/tests/Metadata/Ecma335/Encoding/InstructionEncoderTests.cs +++ b/src/libraries/System.Reflection.Metadata/tests/Metadata/Ecma335/Encoding/InstructionEncoderTests.cs @@ -475,6 +475,28 @@ public void Branch() }, builder.ToArray()); } + [Fact] + public void Switch() + { + var builder = new BlobBuilder(); + var il = new InstructionEncoder(builder, new ControlFlowBuilder()); + var l = il.DefineLabel(); + var switchEncoder = il.Switch(4); + switchEncoder.Branch(l); + switchEncoder.Branch(l); + switchEncoder.Branch(l); + switchEncoder.Branch(l); + + AssertEx.Equal(new byte[] + { + (byte)ILOpCode.Switch, 0x04, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff + }, builder.ToArray()); + } + [Fact] public void BranchAndLabel_Errors() {