示例#1
0
        public void PreprocessingLexer_If_True()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");
            pp.Define("Клиент");

            var code = @"
            #Если Сервер и Клиент Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            var lex = pp.NextLexem();

            Assert.Equal(LexemType.Identifier, lex.Type);
            Assert.Equal("F", lex.Content);

            lex = pp.NextLexem();
            Assert.Equal(LexemType.EndOperator, lex.Type);

            lex = pp.NextLexem();
            Assert.Equal(LexemType.EndOfText, lex.Type);
        }
示例#2
0
        public void PreprocessingLexer_IfElse()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");
            pp.Define("Клиент");
            pp.Define("ВебКлиент");

            var code = @"
            #Если Сервер и Не Клиент Тогда
                А
            #ИначеЕсли ВебКлиент Тогда
                Б
            #ИначеЕсли СовсемНеКлиент Тогда
                Х
            #Иначе
                В
            #КонецЕсли";

            pp.Code = code;

            Lexem lex;

            lex = pp.NextLexem();
            Assert.True(lex.Content == "Б");
            lex = pp.NextLexem();

            Assert.Equal(Token.EndOfText, lex.Token);
            Assert.Equal(LexemType.EndOfText, lex.Type);
        }
示例#3
0
        public void PreprocessingLexer_NoRegionNameWithComment()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область // no name
            #КонецОбласти
            F";

            pp.Code = code;
            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
示例#4
0
        public void PreprocessingLexer_SymbolsAfterEndRegion()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область reg
            #КонецОбласти reg
            F";

            pp.Code = code;
            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
示例#5
0
        public void PreprocessingLexer_BadRegionName()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область -reg
            #КонецОбласти
            F";

            pp.Code = code;
            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
示例#6
0
        public void PreprocessingLexer_Else_Without_If()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");

            var code = @"
            #Иначе
                F;
            #КонецЕсли";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
示例#7
0
        public void PreprocessingLexer_SimpleRegion()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область reg1
            
            #КонецОбласти
            F";

            pp.Code = code;
            var lex = pp.NextLexem();

            Assert.Equal("F", lex.Content);
        }
示例#8
0
        public void PreprocessingLexer_Unclosed_IfBlock()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");

            var code = @"
            #Если Сервер и Клиент Тогда
                F;
            ";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
示例#9
0
        public void PreprocessingLexer_ExcludedLines()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Да Тогда
            F;
            #Иначе
            !!
            #КонецЕсли
            ";

            pp.Code = code;

            Lexem lex;

            do
            {
                lex = pp.NextLexem();
            } while (pp.NextLexem().Token != Token.EndOfText);
            Assert.Equal(Token.EndOfText, lex.Token);
        }
示例#10
0
        private string GetPreprocessedContent(PreprocessingLexer pp, string code)
        {
            pp.Code = code;
            Lexem lex = Lexem.Empty();

            StringBuilder builder = new StringBuilder();

            while (lex.Type != LexemType.EndOfText)
            {
                lex = pp.NextLexem();

                builder.Append(lex.Content);
            }
            return(builder.ToString().Trim());
        }
示例#11
0
        public void PreprocessingLexer_ExpressionUnexpected()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");

            var code = @"
            #Если Сервер ИЛИ + Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
示例#12
0
        public void PreprocessingLexer_Endif_Without_If()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #КонецЕсли
                H;
            ";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
示例#13
0
        public void PreprocessingLexer_DirectiveNotOnNewLine()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область reg
            F; #КонецОбласти
            ";

            pp.Code = code;
            Assert.Throws <SyntaxErrorException>(() => { while (pp.NextLexem().Token != Token.EndOfText)
                                                         {
                                                             ;
                                                         }
                                                 });
        }
示例#14
0
        public void PriorityOperators()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Нет и СовсемНет ИЛИ Да Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            var lex = pp.NextLexem();

            Assert.Equal("F", lex.Content);
        }
示例#15
0
        public void PriorityOperators_WithParenthesis()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Нет и (Да или Да) Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            var lex = pp.NextLexem();

            Assert.Equal(Token.EndOfText, lex.Token);
        }
示例#16
0
        public void ParsingFirstNot()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Не Да Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            var lex = pp.NextLexem();

            Assert.Equal(Token.EndOfText, lex.Token);
        }
示例#17
0
        public void PreprocessingLexer_NoEndRegion()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область reg1
            #Область reg2
            #КонецОбласти
            F";

            pp.Code = code;
            Assert.Throws <SyntaxErrorException>(() => { while (pp.NextLexem().Token != Token.EndOfText)
                                                         {
                                                             ;
                                                         }
                                                 });
        }
示例#18
0
        public void PreprocessingLexer_If_False()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");

            var code = @"
            #Если Сервер и Клиент Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            var lex = pp.NextLexem();

            Assert.Equal(Token.EndOfText, lex.Token);
            Assert.Equal(LexemType.EndOfText, lex.Type);
        }
示例#19
0
        public void PreprocessingLexer_Extra_Endif()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Да Тогда
                F;
            #КонецЕсли
            #КонецЕсли
            ";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => { while (pp.NextLexem().Token != Token.EndOfText)
                                                         {
                                                             ;
                                                         }
                                                 });
        }
示例#20
0
        public void PreprocessingLexer_Unclosed_ElseBlock()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Да и Не Да Тогда
                F;
            #Иначе
                G;
            ";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => { while (pp.NextLexem().Token != Token.EndOfText)
                                                         {
                                                             ;
                                                         }
                                                 });
        }
示例#21
0
        public void PreprocessingLexer_MultipleNestedRegions()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Region reg1
            #Область reg2
            
            #Область if // keywords are ok
            
            #endRegion
            #КонецОбласти // reg 1
            
            #endRegion
            # Область  reg1 // same name is ok

            #КонецОбласти
            F";

            pp.Code = code;
            var lex = pp.NextLexem();

            Assert.Equal("F", lex.Content);
        }