public void ParseCPSID()
        {
            IParser parser = new Parser();

            var myProgram =
                "CPSID 0x011" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xf10c00c0, output[0]);
        }
        public void ParserCanParseDataByteLessThanWordSize()
        {
            IParser parser = new Parser();

            var myProgram =
                "byte: 0x48, 0x69, 0x20" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal((uint)0x00206948, output[0]);
        }
        public void ParseCPS()
        {
            IParser parser = new Parser();

            var myProgram =
                "CPS 0x12" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xf1020012, output[0]);
        }
        public void ParseCPSIE()
        {
            IParser parser = new Parser();

            var myProgram =
                "CPSIE 0x110" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xf1080180, output[0]);
        }
        public void ParserCanParseDataAddress()
        {
            IParser parser = new Parser();

            var myProgram =
                "address: 0x48" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal((uint)0x12, parser.KernelIndex);
        }
        public void ParserParseMOVWTooLarge()
        {
            IParser parser = new Parser();

            var myProgram =
                "MOVW r0, 0x10000" + Environment.NewLine;

            Assert.Throws(typeof(SyntaxException), () =>
            {
                var output = parser.Parse(myProgram);
            });
        }
        public void ParserParseMOVWParse1()
        {
            IParser parser = new Parser();

            var myProgram =
                "MOVW r1, 0x01" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe3001001, output[0]);
        }
        public void ParserParseAND()
        {
            IParser parser = new Parser();

            var myProgram =
                "ANDS a3, a3, 0x20" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe2122020, output[0]);
        }
        public void ParserParseBNEParseNoLabel()
        {
            IParser parser = new Parser();

            var myProgram =
                "BNE loop" + Environment.NewLine;

            Assert.Throws(typeof(SyntaxException), () =>
            {
                parser.Parse(myProgram);
            });
        }
        public void ParserParseSUBSParse01()
        {
            IParser parser = new Parser();

            var myProgram =
                "SUBS r3, r3, 0x01" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe2533001, output[0]);
        }
        public void ParserParseROR()
        {
            IParser parser = new Parser();

            var myProgram =
                "ROR r1, r2, #28" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe1a01e62, output[0]);
        }
        public void ParserParseORRSImmediate()
        {
            IParser parser = new Parser();

            var myProgram =
                "ORRS r1, r4, 0x01" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe3941001, output[0]);
        }
        public void ParserParseLabelReturnsCorrectIndex()
        {
            IParser parser = new Parser();

            var myProgram =
                "MOVT r0, 0x3f20" + Environment.NewLine +
                "loop: MOVW r0, 0x0" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Contains("loop", parser.LabelTable.Keys);
            Assert.Equal((uint)1, parser.LabelTable["loop"]);
        }
        public void ParserParseLab7()
        {
            IParser parser = new Parser();

            var myProgram =
                "MOVW r0, 0x0" + Environment.NewLine +
                "MOVT r0, 0x3f20" + Environment.NewLine +
                "MOVW r1, 0x0" + Environment.NewLine +
                "MOVT r1, 0x20" + Environment.NewLine +
                "" + Environment.NewLine +
                "STR r1, r0, 0x10" + Environment.NewLine +
                "MOVW r2, 0x8000" + Environment.NewLine +
                "" + Environment.NewLine +
                "loop: STR r2, r0, 0x20" + Environment.NewLine +
                "MOVW r3, 0x0" + Environment.NewLine +
                "MOVT r3, 0x10" + Environment.NewLine +
                "wait1: SUBS r3, r3, 0x01" + Environment.NewLine +
                "  BNE wait1" + Environment.NewLine +
                "" + Environment.NewLine +
                "STR r2, r0, 0x2c" + Environment.NewLine +
                "" + Environment.NewLine +
                "MOVW r3, 0x0" + Environment.NewLine +
                "MOVT r3, 0x10" + Environment.NewLine +
                "wait2: SUBS r3, r3, 0x01" + Environment.NewLine +
                "  BNE wait2" + Environment.NewLine +
                "" + Environment.NewLine +
                "BAL loop" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe3000000, output[0]);
            Assert.Equal(0xe3430f20, output[1]);
            Assert.Equal(0xe3001000, output[2]);
            Assert.Equal(0xe3401020, output[3]);
            Assert.Equal(0xe5801010, output[4]);
            Assert.Equal(0xe3082000, output[5]);
            Assert.Equal(0xe5802020, output[6]);
            Assert.Equal(0xe3003000, output[7]);
            Assert.Equal(0xe3403010, output[8]);
            Assert.Equal(0xe2533001, output[9]);
            Assert.Equal((uint)0x1afffffd, output[10]);
            Assert.Equal(0xe580202c, output[11]);
            Assert.Equal(0xe3003000, output[12]);
            Assert.Equal(0xe3403010, output[13]);
            Assert.Equal(0xe2533001, output[14]);
            Assert.Equal((uint)0x1afffffd, output[15]);
            Assert.Equal(0xeafffff4, output[16]);
        }
        public void ParserParseCMPI()
        {
            IParser parser = new Parser();

            var myProgram =
                "CMPI a4, 0x4" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe3530004, output[0]);
        }
        public void ParserParseBNEParseWithLabelAfter()
        {
            IParser parser = new Parser();

            var myProgram =
                "BNE loop" + Environment.NewLine +
                "loop: MOVW r0, 0x0" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal((uint)0x1affffff, output[0]);
            Assert.Equal(0xe3000000, output[1]);
        }
        public void ParserParseMULRSParser0r0()
        {
            IParser parser = new Parser();

            var myProgram =
                "MULRS r0, r0, r1" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe0001090, output[0]);
        }
        public void ParserParseLDRBPositive()
        {
            IParser parser = new Parser();

            var myProgram =
                "LDRB a1, v1, 0x0" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe5d40000, output[0]);
        }
        public void ParserParseORRRSRegister()
        {
            IParser parser = new Parser();

            var myProgram =
                "ORRRS r1, r4, r3" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe1941003, output[0]);
        }
        public void ParserParseLDRPositive()
        {
            IParser parser = new Parser();

            var myProgram =
                "LDR v4, sp, 0x8" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe59d7008, output[0]);
        }
        public void ParserParsePUSHR1()
        {
            IParser parser = new Parser();

            var myProgram =
                "PUSH r1" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe52d1004, output[0]);
        }
        public void ParserReturnsUIntArray()
        {
            IParser parser = new Parser();
            var result = parser.Parse("");

            Assert.IsType(typeof(uint[]), result);
        }
        public void ParserParseSTRParse10()
        {
            IParser parser = new Parser();

            var myProgram =
                "STR r1, r0, 0x10" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe5801010, output[0]);
        }
        public void ParserWillThrowIfAddressIsNotFollowedByANumber()
        {
            IParser parser = new Parser();

            var myProgram =
                "address:" + Environment.NewLine;

            Assert.Throws<SyntaxException>(() =>
            {
                var output = parser.Parse(myProgram);
            });
        }
        public void ParserParseMOVNotRegr18()
        {
            IParser parser = new Parser();

            var myProgram =
                "MOV r0, r18" + Environment.NewLine;

            Assert.Throws(typeof(SyntaxException), () =>
            {
                var output = parser.Parse(myProgram);
            });
        }
        public void ParserParseBLParseWithLabel()
        {
            IParser parser = new Parser();

            var myProgram =
                "loop: MOVW r0, 0x0" + Environment.NewLine +
                "BL loop" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe3000000, output[0]);
            Assert.Equal(0xebfffffd, output[1]);
        }
        public void ParserStartsOnLine1()
        {
            IParser parser = new Parser();
            uint lineNumber = parser.LineNumber;

            Assert.Equal((uint)1, lineNumber);
        }
        public void ParserParseMOVParser0r1()
        {
            IParser parser = new Parser();

            var myProgram =
                "MOV r0, r1" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe1a00001, output[0]);
        }
        public void ParserWillThrowIfByteValueIsTooBig()
        {
            IParser parser = new Parser();

            var myProgram =
                "byte: 0x100, 0x50, 0x40, 0x0" + Environment.NewLine;

            Assert.Throws<SyntaxException>(() =>
            {
                var output = parser.Parse(myProgram);
            });
        }
        public void ParserParseMOVTParse0()
        {
            IParser parser = new Parser();

            var myProgram =
                "MOVT r0, 0x0" + Environment.NewLine;

            var output = parser.Parse(myProgram);

            Assert.Equal(0xe3400000, output[0]);
        }