namespace Jint.Tests.Runtime; public class StringTests { public StringTests() { _engine = new Engine() .SetValue("log", new Action(Console.WriteLine)) .SetValue("assert", new Action(Assert.True)) .SetValue("equal", new Action(Assert.Equal)); } private readonly Engine _engine; [Fact] public void StringConcatenationAndReferences() { const string script = @" var foo = 'foo'; foo += 'foo'; var bar = foo; bar += 'bar'; "; var value = _engine.Execute(script); var foo = _engine.Evaluate("foo").AsString(); var bar = _engine.Evaluate("bar").AsString(); Assert.Equal("foofoo", foo); Assert.Equal("foofoobar", bar); } [Fact] public void TrimLeftRightShouldBeSameAsTrimStartEnd() { _engine.Execute(@" assert(''.trimLeft === ''.trimStart); assert(''.trimRight === ''.trimEnd); "); } [Fact] public void HasProperIteratorPrototypeChain() { const string Script = @" // Iterator instance var iterator = ''[Symbol.iterator](); // %StringIteratorPrototype% var proto1 = Object.getPrototypeOf(iterator); // %IteratorPrototype% var proto2 = Object.getPrototypeOf(proto1);"; var engine = new Engine(); engine.Execute(Script); Assert.True(engine.Evaluate("proto2.hasOwnProperty(Symbol.iterator)").AsBoolean()); Assert.True(engine.Evaluate("!proto1.hasOwnProperty(Symbol.iterator)").AsBoolean()); Assert.True(engine.Evaluate("!iterator.hasOwnProperty(Symbol.iterator)").AsBoolean()); Assert.True(engine.Evaluate("iterator[Symbol.iterator]() === iterator").AsBoolean()); } }