예제 #1
0
            public async Task <Unit> Handle(Request request, CancellationToken cancellationToken)
            {
                var template = _templateLocator.Get("EntityServiceBuilder");

                var tokens = new TokensBuilder()
                             .With(nameof(request.EntityName), (Token)request.EntityName)
                             .With(nameof(request.Directory), (Token)request.Directory)
                             .Build();

                var result = _templateProcessor.Process(template, tokens);

                var entityNameSnakeCase = _templateProcessor.Process("{{ entityNameSnakeCase }}", tokens);

                var filename = $"{entityNameSnakeCase}.service.ts";

                if (_fileSystem.Exists($@"{request.Directory}/{filename}"))
                {
                    if (request.Force)
                    {
                        System.IO.File.Delete($@"{request.Directory}/{filename}");
                        System.IO.File.Delete($@"{request.Directory}/{entityNameSnakeCase}.service.spec.ts");
                    }
                    else
                    {
                        return(new());
                    }
                }

                _commandService.Start($"ng g s {entityNameSnakeCase}", request.Directory);

                _fileSystem.WriteAllLines($@"{request.Directory}/{filename}", result);

                return(new());
            }
예제 #2
0
        public void SolveDoubleHexTest()
        {
            var lexer      = new Mock <ILexer>();
            var parser     = new Mock <IParser>();
            var simplifier = new Mock <ISimplifier>();

            var strExp = "1 + 1";
            var exp    = new Add(new Number(1), new Number(1));

            var tokens = new TokensBuilder()
                         .Number(2)
                         .Operation(Operations.Addition)
                         .Number(1)
                         .Tokens;

            lexer.Setup(l => l.Tokenize(strExp)).Returns(() => tokens);
            parser.Setup(p => p.Parse(tokens)).Returns(() => exp);

            simplifier.Setup(s => s.Analyze(It.IsAny <Add>())).Returns <Add>(e => e);

            var processor = new Processor(lexer.Object, parser.Object, simplifier.Object, null)
            {
                NumeralSystem = NumeralSystem.Hexidecimal
            };
            var result = processor.Solve <StringResult>(strExp);

            lexer.Verify(l => l.Tokenize(It.IsAny <string>()), Times.Once());
            parser.Verify(p => p.Parse(It.IsAny <IEnumerable <IToken> >()), Times.Once());

            Assert.Equal("0x2", result.Result);
        }
예제 #3
0
        public void ParseBoolTest()
        {
            var lexer  = new Mock <ILexer>();
            var parser = new Mock <IParser>();

            var tokens = new TokensBuilder()
                         .VariableX()
                         .Operation(Operations.Addition)
                         .Number(1)
                         .Tokens;

            lexer.Setup(l => l.Tokenize("x + 1")).Returns(() => tokens);

            var exp = new Add(Variable.X, new Number(1));

            parser.Setup(p => p.Parse(tokens)).Returns(() => exp);

            var processor = new Processor(lexer.Object, parser.Object, null, null);
            var result    = processor.Parse("x + 1");

            lexer.Verify(l => l.Tokenize(It.IsAny <string>()), Times.Once());
            parser.Verify(p => p.Parse(It.IsAny <IEnumerable <IToken> >()), Times.Once());

            Assert.Equal(exp, result);
        }
예제 #4
0
        public void SolveStringTest()
        {
            var lexer      = new Mock <ILexer>();
            var parser     = new Mock <IParser>();
            var simplifier = new Mock <ISimplifier>();

            var strExp = "x := 1";
            var exp    = new Define(Variable.X, new Number(1));

            var tokens = new TokensBuilder()
                         .Function(Functions.Define, 2)
                         .OpenBracket()
                         .VariableX()
                         .Comma()
                         .Number(1)
                         .CloseBracket()
                         .Tokens;

            lexer.Setup(l => l.Tokenize(strExp)).Returns(() => tokens);
            parser.Setup(p => p.Parse(tokens)).Returns(() => exp);

            simplifier.Setup(s => s.Analyze(It.IsAny <Define>())).Returns <Define>(e => e);

            var processor = new Processor(lexer.Object, parser.Object, simplifier.Object, null);
            var result    = processor.Solve <StringResult>(strExp);

            lexer.Verify(l => l.Tokenize(It.IsAny <string>()), Times.Once());
            parser.Verify(p => p.Parse(It.IsAny <IEnumerable <IToken> >()), Times.Once());

            Assert.Equal("The value '1' was assigned to the variable 'x'.", result.Result);
        }
예제 #5
0
        public void SolveBoolTest()
        {
            var lexer      = new Mock <ILexer>();
            var parser     = new Mock <IParser>();
            var simplifier = new Mock <ISimplifier>();

            var strExp = "true & false";
            var exp    = new And(new Bool(true), new Bool(false));

            var tokens = new TokensBuilder()
                         .True()
                         .Operation(Operations.And)
                         .False()
                         .Tokens;

            lexer.Setup(l => l.Tokenize(strExp)).Returns(() => tokens);
            parser.Setup(p => p.Parse(tokens)).Returns(() => exp);

            simplifier.Setup(s => s.Analyze(It.IsAny <And>())).Returns <And>(e => e);

            var processor = new Processor(lexer.Object, parser.Object, simplifier.Object, null);
            var result    = processor.Solve <BooleanResult>(strExp);

            lexer.Verify(l => l.Tokenize(It.IsAny <string>()), Times.Once());
            parser.Verify(p => p.Parse(It.IsAny <IEnumerable <IToken> >()), Times.Once());

            Assert.False(result.Result);
        }
예제 #6
0
        public void SolveComplexTest()
        {
            var lexer      = new Mock <ILexer>();
            var parser     = new Mock <IParser>();
            var simplifier = new Mock <ISimplifier>();

            var strExp  = "conjugate(2.3 + 1.4i)";
            var complex = new Complex(2.3, 1.4);
            var exp     = new Conjugate(new ComplexNumber(complex));

            var tokens = new TokensBuilder()
                         .Function(Functions.Conjugate, 1)
                         .OpenBracket()
                         .Number(2.3)
                         .Operation(Operations.Addition)
                         .Number(1.4)
                         .Operation(Operations.Multiplication)
                         .Variable("i")
                         .CloseBracket()
                         .Tokens;

            lexer.Setup(l => l.Tokenize(strExp)).Returns(() => tokens);
            parser.Setup(p => p.Parse(tokens)).Returns(() => exp);

            simplifier.Setup(s => s.Analyze(It.IsAny <Conjugate>())).Returns <Conjugate>(e => e);

            var processor = new Processor(lexer.Object, parser.Object, simplifier.Object, null);
            var result    = processor.Solve <ComplexNumberResult>(strExp);

            lexer.Verify(l => l.Tokenize(It.IsAny <string>()), Times.Once());
            parser.Verify(p => p.Parse(It.IsAny <IEnumerable <IToken> >()), Times.Once());

            Assert.Equal(Complex.Conjugate(complex), result.Result);
        }
예제 #7
0
            public async Task <Unit> Handle(Request request, CancellationToken cancellationToken)
            {
                var template = _templateLocator.Get(nameof(IntlBuilder));

                var tokens = new TokensBuilder()
                             .With(nameof(request.Name), (Token)request.Name)
                             .Build();

                var lines = _templateProcessor.Process(template, tokens);

                _fileSystem.WriteAllLines($"{request.Directory}{Path.DirectorySeparatorChar}{((Token)request.Name).SnakeCase}-intl.ts", lines);

                return(new());
            }
예제 #8
0
            public Task <Unit> Handle(Request request, CancellationToken cancellationToken)
            {
                Settings settings = _settingsProvider.Get(request.Directory);

                var tokens = new TokensBuilder()
                             .With(nameof(request.EntityName), (Token)request.EntityName)
                             .With(nameof(request.Directory), (Token)request.Directory)
                             .Build();

                var result = new List <string>()
                {
                    _templateProcessor.Process("export type {{ entityNamePascalCase }} = {", tokens)
                };

                var modelsDirectory = $"{settings.DomainDirectory}{Path.DirectorySeparatorChar}Models";

                foreach (var path in Directory.GetFiles(modelsDirectory, $"{((Token)request.EntityName).PascalCase}.cs", SearchOption.AllDirectories))
                {
                    foreach (var line in File.ReadAllLines(path))
                    {
                        if (line.Contains("public string") || line.Contains("public Guid"))
                        {
                            result.Add($"    {_namingConventionConverter.Convert(NamingConvention.CamelCase, line.Split(' ')[10])}: string,");
                        }

                        if (line.Contains("public int") || line.Contains("public double"))
                        {
                            result.Add($"    {_namingConventionConverter.Convert(NamingConvention.CamelCase, line.Split(' ')[10])}: number,");
                        }

                        if (line.Contains("public bool"))
                        {
                            result.Add($"    {_namingConventionConverter.Convert(NamingConvention.CamelCase, line.Split(' ')[10])}: boolean,");
                        }
                    }
                }

                result.Add("};");

                var filePath = _templateProcessor.Process("{{ directory }}//{{ entityNameSnakeCase }}.ts", tokens);

                if (System.IO.File.Exists(filePath) && request.Force == false)
                {
                    return(Task.FromResult(new Unit()));
                }

                _fileWriter.WriteAllLines(filePath, result.ToArray());

                return(Task.FromResult(new Unit()));
            }
예제 #9
0
        public void SolveExpTest()
        {
            var lexer          = new Mock <ILexer>();
            var parser         = new Mock <IParser>();
            var simplifier     = new Mock <ISimplifier>();
            var differentiator = new Mock <IDifferentiator>();

            var strExp = "deriv(x)";
            var exp    = new Derivative(differentiator.Object, simplifier.Object, Variable.X, Variable.X);
            var diff   = new Number(1);

            var tokens = new TokensBuilder()
                         .Function(Functions.Derivative, 1)
                         .OpenBracket()
                         .VariableX()
                         .CloseBracket()
                         .Tokens;

            lexer.Setup(l => l.Tokenize(strExp)).Returns(() => tokens);
            parser.Setup(p => p.Parse(tokens)).Returns(() => exp);

            simplifier.Setup(s => s.Analyze(It.IsAny <Number>())).Returns <Number>(e => e);
            simplifier.Setup(s => s.Analyze(It.IsAny <Derivative>())).Returns <Derivative>(e => e);

            differentiator.Setup(d => d.Analyze(It.IsAny <Derivative>())).Returns(() => diff);
            differentiator.SetupProperty(d => d.Variable);
            differentiator.SetupProperty(d => d.Parameters);

            var processor = new Processor(lexer.Object, parser.Object, simplifier.Object, differentiator.Object);
            var result    = processor.Solve <ExpressionResult>(strExp);

            lexer.Verify(l => l.Tokenize(It.IsAny <string>()), Times.Once());
            parser.Verify(p => p.Parse(It.IsAny <IEnumerable <IToken> >()), Times.Once());

            Assert.Equal(new Number(1), result.Result);
        }
예제 #10
0
            // 解析エラーがある場合は null を返す
            // 「null 以外を返す AND 戻り値の Count != 0 ⇔ 正常な Expr である」が成り立っている
            public static IReadOnlyList <Tokens.IToken> ToTokens(string text)
            {
                var tokensBuilder = new TokensBuilder();

                foreach (var c in text)
                {
                    if (char.IsWhiteSpace(c))
                    {
                        if (!tokensBuilder.TryAddSpace())
                        {
                            return(null);
                        }
                        continue;
                    }

                    if (c == '\r' || c == '\n')
                    {
                        if (!tokensBuilder.TryAddLineBreak())
                        {
                            return(null);
                        }
                        continue;
                    }

                    if (c == '+' || c == '+')
                    {
                        if (!tokensBuilder.TryAddPlus())
                        {
                            return(null);
                        }
                        continue;
                    }

                    if (c == '-' || c == '-')
                    {
                        if (!tokensBuilder.TryAddMinus())
                        {
                            return(null);
                        }
                        continue;
                    }

                    if (c == 'd' || c == 'D' || c == 'd' || c == 'D')
                    {
                        if (!tokensBuilder.TryAddD())
                        {
                            return(null);
                        }
                        continue;
                    }

                    foreach (var(number, character) in numbers)
                    {
                        if (c.ToString() == character.ToString())
                        {
                            if (!tokensBuilder.TryAddNumber(number))
                            {
                                return(null);
                            }
                            goto Continue;
                        }
                    }

                    return(null);

                    Continue :;
                }

                return(tokensBuilder.FinishOrDefault());
            }