コード例 #1
0
        public void Tokenize_Mixed()
        {
            var tokenizer = new MicrowaveLanguageTokenizer();
            var tokens    = tokenizer.Tokenize(@"DomainClass User{
	                                Id: Guid
	                                
                                    UpdateName(Name: String): {
		                                UserId: Guid
		                                Age: Int32
	                                }

	                                Posts: [Post]
                                }");

            Assert.AreEqual(27, tokens.Count);

            Assert.AreEqual(TokenType.DomainClass, tokens[0].TokenType);
            Assert.AreEqual(TokenType.Value, tokens[1].TokenType);
            Assert.AreEqual(TokenType.ObjectBracketOpen, tokens[2].TokenType);
            Assert.AreEqual(TokenType.Value, tokens[3].TokenType);
            Assert.AreEqual(TokenType.ParameterBracketOpen, tokens[7].TokenType);
            Assert.AreEqual("UpdateName", tokens[6].Value);
            Assert.AreEqual("Name", tokens[8].Value);
            Assert.AreEqual("String", tokens[10].Value);
        }
コード例 #2
0
        public void Tokenize_DomainClass_Property()
        {
            var tokenizer = new MicrowaveLanguageTokenizer();
            var tokens    = tokenizer.Tokenize(@"DomainClass User{
                                                Id: Guid
                                            }");

            Assert.AreEqual(7, tokens.Count);

            Assert.AreEqual("Id", tokens[3].Value);
            Assert.AreEqual(TokenType.TypeDefSeparator, tokens[4].TokenType);
            Assert.AreEqual("Guid", tokens[5].Value);
        }
コード例 #3
0
        public void Tokenize_ListProperty()
        {
            var tokenizer = new MicrowaveLanguageTokenizer();
            var tokens    = tokenizer.Tokenize(@"DomainClass User{
                                                Posts: [Post]
                                            }");

            Assert.AreEqual(9, tokens.Count);

            Assert.AreEqual(TokenType.ListBracketOpen, tokens[5].TokenType);
            Assert.AreEqual(TokenType.Value, tokens[6].TokenType);
            Assert.AreEqual("Post", tokens[6].Value);
            Assert.AreEqual(TokenType.ListBracketClose, tokens[7].TokenType);
        }
コード例 #4
0
        public void Tokenize_DomainClass()
        {
            var tokenizer = new MicrowaveLanguageTokenizer();
            var tokens    = tokenizer.Tokenize(@"DomainClass User{
                                }");

            Assert.AreEqual(4, tokens.Count);

            Assert.AreEqual(TokenType.DomainClass, tokens[0].TokenType);
            Assert.AreEqual(TokenType.Value, tokens[1].TokenType);
            Assert.AreEqual("User", tokens[1].Value);
            Assert.AreEqual(TokenType.ObjectBracketOpen, tokens[2].TokenType);
            Assert.AreEqual(TokenType.ObjectBracketClose, tokens[3].TokenType);
        }
コード例 #5
0
        public void Tokenize_CreateMethod()
        {
            var tokenizer = new MicrowaveLanguageTokenizer();
            var tokens    = tokenizer.Tokenize(@"DomainClass User{
                                                Create(Name: String)
                                            }");

            Assert.AreEqual(10, tokens.Count);

            Assert.AreEqual("Create", tokens[3].Value);
            Assert.AreEqual(TokenType.CreateMethod, tokens[3].TokenType);
            Assert.AreEqual(TokenType.ParameterBracketOpen, tokens[4].TokenType);
            Assert.AreEqual(TokenType.TypeDefSeparator, tokens[6].TokenType);
        }
コード例 #6
0
        public void Tokenize_LoadToken()
        {
            var tokenizer = new MicrowaveLanguageTokenizer();
            var tokens    = tokenizer.Tokenize(@"DomainClass User{
                                                AddPost(NewPost: @Load Post): {
                                                    PostId: Guid
                                                }
                                            }");

            Assert.AreEqual(17, tokens.Count);

            Assert.AreEqual("NewPost", tokens[5].Value);
            Assert.AreEqual(TokenType.LoadToken, tokens[7].TokenType);
            Assert.AreEqual(TokenType.Value, tokens[8].TokenType);
            Assert.AreEqual("Post", tokens[8].Value);
        }
コード例 #7
0
        public void Tokenize_AsyncDomainHook_Update()
        {
            var tokenizer = new MicrowaveLanguageTokenizer();
            var tokens    = tokenizer.Tokenize(@"DomainClass User{
                                                Create()
                                            }

                                            SendBirthdayMail asynchronously on User.UpdateAge");

            Assert.AreEqual(11, tokens.Count);

            Assert.AreEqual(TokenType.Value, tokens[7].TokenType);
            Assert.AreEqual("SendBirthdayMail", tokens[7].Value);
            Assert.AreEqual(TokenType.AsynchronouslyToken, tokens[8].TokenType);
            Assert.AreEqual(TokenType.DomainHookOn, tokens[9].TokenType);
            Assert.AreEqual("User.UpdateAge", tokens[10].Value);
            Assert.AreEqual(TokenType.DomainHookEventDefinition, tokens[10].TokenType);
        }
コード例 #8
0
        public void Tokenize_CreateMethod_MultipleParams()
        {
            var tokenizer = new MicrowaveLanguageTokenizer();
            var tokens    = tokenizer.Tokenize(@"DomainClass User{
                                                Create(Name: String, Age: Int32)
                                            }");

            Assert.AreEqual(14, tokens.Count);

            Assert.AreEqual("Create", tokens[3].Value);
            Assert.AreEqual(TokenType.CreateMethod, tokens[3].TokenType);
            Assert.AreEqual(TokenType.ParameterBracketOpen, tokens[4].TokenType);
            Assert.AreEqual(TokenType.TypeDefSeparator, tokens[6].TokenType);
            Assert.AreEqual(TokenType.ParamSeparator, tokens[8].TokenType);
            Assert.AreEqual("Age", tokens[9].Value);
            Assert.AreEqual(TokenType.TypeDefSeparator, tokens[10].TokenType);
            Assert.AreEqual("Int32", tokens[11].Value);
        }
コード例 #9
0
        private static void Main(string[] args)
        {
            var wsbFile                        = args.Length >= 1 ? args[0] : "Schema.mic";
            var basePathToSolution             = args.Length >= 2 ? args[1] : "../";
            var domainNameSpace                = "Domain";
            var applicationNameSpace           = "Application";
            var sqlAdapterNameSpace            = "SqlAdapter";
            var webAdapterNameSpace            = "HttpAdapter";
            var domainBasePath                 = $"{basePathToSolution}{domainNameSpace}/Generated/";
            var applicationBasePath            = $"{basePathToSolution}{applicationNameSpace}/Generated/";
            var applicationRealClassesBasePath = $"{basePathToSolution}{applicationNameSpace}/";
            var domainRealClassesBasePath      = $"{basePathToSolution}{domainNameSpace}/";
            var sqlAdapterBasePath             = $"{basePathToSolution}{sqlAdapterNameSpace}/Generated/";
            var webAdapterBasePath             = $"{basePathToSolution}{webAdapterNameSpace}/Generated/";
            var asynHostBasePath               = $"{basePathToSolution}AsyncHost";
            var injectionBasePath              = $"{basePathToSolution}Host";

            var tokenizer         = new MicrowaveLanguageTokenizer();
            var parser            = new MicrowaveLanguageParser();
            var domainBuilder     = new DomainWriter(domainBasePath, domainRealClassesBasePath);
            var applicationWriter = new ApplicationWriter(applicationNameSpace, applicationBasePath, applicationRealClassesBasePath);
            var sqlAdapterWriter  = new SqlAdapterWriter(sqlAdapterNameSpace, sqlAdapterBasePath);
            var webAdapterWriter  = new HttpAdapterWriter(webAdapterNameSpace, webAdapterBasePath);
            var dependencyInjectionWriterAsyncHost = new DependencyInjectionBuilderAsyncHost();

            var dependencyInjectionWriter = new DependencyInjectionBuilderHost();

            using (var reader = new StreamReader(wsbFile))
            {
                var content = reader.ReadToEnd();

                var dslParser  = new DslParser(tokenizer, parser);
                var domainTree = dslParser.Parse(content);

                domainBuilder.Write(domainTree, domainBasePath);
                applicationWriter.Write(domainTree);
                sqlAdapterWriter.Write(domainTree);
                webAdapterWriter.Write(domainTree);
                var codeNamespace = dependencyInjectionWriter.Build(domainTree.Classes, domainTree.SynchronousDomainHooks);
                new FileWriter(injectionBasePath).WriteToFile("Base/", codeNamespace);
                var write = dependencyInjectionWriterAsyncHost.Write(domainTree.Classes, domainTree.AsyncDomainHooks);
                new FileWriter(asynHostBasePath).WriteToFile("Base/", write);
            }
        }
コード例 #10
0
        public void Tokenize_LineCounter()
        {
            var tokenizer = new MicrowaveLanguageTokenizer();
            var tokens    = tokenizer.Tokenize("DomainClass User{\r\nId: Guid\r\nPosts: [Post]\r\n}");

            Assert.AreEqual(12, tokens.Count);
            Assert.AreEqual(1, tokens[0].LineNumber);
            Assert.AreEqual(1, tokens[1].LineNumber);
            Assert.AreEqual(1, tokens[2].LineNumber);
            Assert.AreEqual(2, tokens[3].LineNumber);
            Assert.AreEqual(2, tokens[4].LineNumber);
            Assert.AreEqual(2, tokens[5].LineNumber);
            Assert.AreEqual(3, tokens[6].LineNumber);
            Assert.AreEqual(3, tokens[7].LineNumber);
            Assert.AreEqual(3, tokens[8].LineNumber);
            Assert.AreEqual(3, tokens[9].LineNumber);
            Assert.AreEqual(3, tokens[10].LineNumber);
            Assert.AreEqual(4, tokens[11].LineNumber);
        }
コード例 #11
0
        public void Tokenize_DomainClass_Method()
        {
            var tokenizer = new MicrowaveLanguageTokenizer();
            var tokens    = tokenizer.Tokenize(@"DomainClass User{
                                                UpdateName(Name: String): {
		                                            UserId: Guid
		                                            Age: Int32
	                                            }
                                            }");

            Assert.AreEqual(19, tokens.Count);

            Assert.AreEqual("UpdateName", tokens[3].Value);
            Assert.AreEqual(TokenType.ParameterBracketOpen, tokens[4].TokenType);
            Assert.AreEqual(TokenType.TypeDefSeparator, tokens[6].TokenType);
            Assert.AreEqual(TokenType.TypeDefSeparator, tokens[9].TokenType);
            Assert.AreEqual(TokenType.ObjectBracketOpen, tokens[10].TokenType);
            Assert.AreEqual("UserId", tokens[11].Value);
            Assert.AreEqual(TokenType.TypeDefSeparator, tokens[12].TokenType);
            Assert.AreEqual("Guid", tokens[13].Value);
        }