Exemple #1
0
        private static Agent CreateAsyncTestAgent(string harnessDirectory, [NotNull] TestMetadata metadata, bool isStrict)
        {
            var includes = new HashSet <string> {
                "assert.js", "sta.js", "doneprintHandle.js"
            };

            foreach (var include in metadata.Includes)
            {
                includes.Add(include);
            }

            var agent = new Agent();

            SetupRealm(agent, agent.Realm);

            foreach (var include in includes)
            {
                var file = Path.Combine(harnessDirectory, include);
                agent.QueueFile(file, new ScriptOptions
                {
                    Type        = ScriptType.Script,
                    ForceStrict = isStrict
                });
            }

            return(agent);
        }
Exemple #2
0
        private static void RunTest(string harnessDirectory, [NotNull] TestMetadata metadata, string testSource, string fullName)
        {
            // Web browser only feature
            if (metadata.Features.Contains("caller"))
            {
                return;
            }

            // TODO
            if (metadata.Features.Contains("BigInt"))
            {
                return;
            }

            // TODO
            if (metadata.Features.Contains("async-iteration"))
            {
                return;
            }

            // TODO
            if (metadata.Features.Contains("generators"))
            {
                return;
            }

            // TODO
            if (metadata.Features.Contains("object-rest"))
            {
                return;
            }

            // TODO
            if (metadata.Features.Contains("class-fields-private"))
            {
                return;
            }

            // TODO
            if (metadata.Features.Contains("class-fields-public"))
            {
                return;
            }

            // TODO
            if (metadata.Includes.Contains("tcoHelper.js"))
            {
                return;
            }

            // TODO
            if (metadata.Async)
            {
                return;
            }

            if (metadata.NegativePhase != null)
            {
                RunNegativeTest(harnessDirectory, metadata, testSource, fullName);
            }
            else if (metadata.Raw)
            {
                throw new NotImplementedException();
            }
            else if (metadata.Async)
            {
                if (!metadata.NoStrict)
                {
                    var agent = CreateAsyncTestAgent(harnessDirectory, metadata, true);
                    agent.QueueCode(testSource, new ScriptOptions
                    {
                        ScriptName  = fullName,
                        Type        = metadata.Module ? ScriptType.Module : ScriptType.Script,
                        ForceStrict = true
                    });
                    agent.RunAllJobs();
                }
                if (!metadata.OnlyStrict)
                {
                    var agent = CreateAsyncTestAgent(harnessDirectory, metadata, false);
                    agent.QueueCode(testSource, new ScriptOptions
                    {
                        ScriptName = fullName,
                        Type       = metadata.Module ? ScriptType.Module : ScriptType.Script
                    });
                    agent.RunAllJobs();
                }
            }
            else
            {
                if (!metadata.NoStrict)
                {
                    var agent = CreateTestAgent(harnessDirectory, metadata, true);
                    agent.QueueCode(testSource, new ScriptOptions
                    {
                        ScriptName  = fullName,
                        Type        = metadata.Module ? ScriptType.Module : ScriptType.Script,
                        ForceStrict = true
                    });
                    agent.RunAllJobs();
                }
                if (!metadata.OnlyStrict)
                {
                    var agent = CreateTestAgent(harnessDirectory, metadata, false);
                    agent.QueueCode(testSource, new ScriptOptions
                    {
                        ScriptName = fullName,
                        Type       = metadata.Module ? ScriptType.Module : ScriptType.Script
                    });
                    agent.RunAllJobs();
                }
            }
        }
Exemple #3
0
        private static TestMetadata ParseMetadata([NotNull] string metadataText)
        {
            var yaml = new YamlStream();

            yaml.Load(new StringReader(metadataText));

            var metadata = new TestMetadata();

            var mapping = (YamlMappingNode)yaml.Documents[0].RootNode;

            if (mapping.Children.TryGetValue("negative", out var negative))
            {
                metadata.NegativePhase = ((YamlScalarNode)negative["phase"]).Value;
                metadata.NegativeType  = ((YamlScalarNode)negative["type"]).Value;
            }

            if (mapping.Children.TryGetValue("includes", out var includes))
            {
                var includesSequence = (YamlSequenceNode)includes;
                foreach (var yamlNode in includesSequence)
                {
                    var include = (YamlScalarNode)yamlNode;
                    metadata.Includes.Add(include.Value);
                }
            }

            if (mapping.Children.TryGetValue("features", out var features))
            {
                var featuresSequence = (YamlSequenceNode)features;
                foreach (var yamlNode in featuresSequence)
                {
                    var feature = (YamlScalarNode)yamlNode;
                    metadata.Features.Add(feature.Value);
                }
            }

            if (mapping.Children.TryGetValue("flags", out var flags))
            {
                var flagsNode = (YamlSequenceNode)flags;
                foreach (var yamlNode in flagsNode)
                {
                    var flag = (YamlScalarNode)yamlNode;
                    switch (flag.Value)
                    {
                    case "onlyStrict":
                        metadata.OnlyStrict = true;
                        break;

                    case "noStrict":
                        metadata.NoStrict = true;
                        break;

                    case "module":
                        metadata.Module = true;
                        break;

                    case "raw":
                        metadata.Raw = true;
                        break;

                    case "async":
                        metadata.Async = true;
                        break;

                    case "generated":
                        metadata.Generated = true;
                        break;
                    }
                }
            }

            if (mapping.Children.TryGetValue("info", out var info))
            {
                var infoNode = (YamlScalarNode)info;
                metadata.Info = infoNode.Value;
            }

            if (mapping.Children.TryGetValue("esid", out var esid))
            {
                var esidNode = (YamlScalarNode)esid;
                metadata.EsId = esidNode.Value;
            }

            if (mapping.Children.TryGetValue("es5id", out var es5Id))
            {
                var es5IdNode = (YamlScalarNode)es5Id;
                metadata.Es5Id = es5IdNode.Value;
            }

            if (mapping.Children.TryGetValue("es6id", out var es6Id))
            {
                var es6IdNode = (YamlScalarNode)es6Id;
                metadata.Es6Id = es6IdNode.Value;
            }

            if (mapping.Children.TryGetValue("description", out var description))
            {
                var descriptionNode = (YamlScalarNode)description;
                metadata.Description = descriptionNode.Value;
            }

            if (mapping.Children.TryGetValue("author", out var author))
            {
                var authorNode = (YamlScalarNode)author;
                metadata.Author = authorNode.Value;
            }

            return(metadata);
        }
Exemple #4
0
        private static void RunNegativeTest(string harnessDirectory, [NotNull] TestMetadata metadata, string testSource, string fullName)
        {
            if (metadata.Raw)
            {
                throw new NotImplementedException();
            }
            if (metadata.Async)
            {
                throw new NotImplementedException();
            }

            var isEarly = metadata.NegativePhase == "early";

            if (!metadata.NoStrict)
            {
                var threw = false;
                var agent = CreateTestAgent(harnessDirectory, metadata, true);
                try
                {
                    agent.QueueCode(testSource, new ScriptOptions
                    {
                        ScriptName  = fullName,
                        Type        = metadata.Module ? ScriptType.Module : ScriptType.Script,
                        ForceStrict = true
                    });
                    agent.RunAllJobs();
                }
                catch (ScriptException e)
                {
                    var syntaxError = agent.GetPrototypeOf(e.Value) == agent.Realm.SyntaxErrorPrototype;
                    if (isEarly && !syntaxError)
                    {
                        throw;
                    }

                    threw = true;
                }

                if (!threw)
                {
                    throw new InvalidOperationException();
                }
            }

            if (!metadata.OnlyStrict)
            {
                var threw = false;
                var agent = CreateTestAgent(harnessDirectory, metadata, false);
                try
                {
                    agent.QueueCode(testSource, new ScriptOptions
                    {
                        ScriptName = fullName,
                        Type       = metadata.Module ? ScriptType.Module : ScriptType.Script
                    });
                    agent.RunAllJobs();
                }
                catch (ScriptException e)
                {
                    var syntaxError = agent.GetPrototypeOf(e.Value) == agent.Realm.SyntaxErrorPrototype;
                    if (isEarly && !syntaxError)
                    {
                        throw;
                    }

                    threw = true;
                }

                if (!threw)
                {
                    throw new InvalidOperationException();
                }
            }
        }