using Jint.Native;

namespace Jint.Tests.Runtime
{
    public class ObjectInstanceTests
    {
        [Fact]
        public void RemovingFirstPropertyFromObjectInstancePropertiesBucketAndEnumerating()
        {
            var engine = new Engine();
            var instance = new JsObject(engine);
            instance.FastSetDataProperty("bare", JsValue.Null);
            instance.FastSetDataProperty("scope", JsValue.Null);
            instance.RemoveOwnProperty("bare");
            var propertyNames = instance.GetOwnProperties().Select(x => x.Key).ToList();
            Assert.Equal(new JsValue[] { "scope" }, propertyNames);
        }

        [Theory]
        [InlineData("Array")]
        [InlineData("Boolean")]
        [InlineData("Date")]
        [InlineData("Error")]
        [InlineData("Number")]
        [InlineData("Object")]
        [InlineData("String")]
        public void ExtendingObjects(string baseType)
        {
            var code = $@"
                class My{baseType} extends {baseType} {{
                    constructor(...args) {{
                        super(...args);
                    }} 
                }}
                const o = new My{baseType}();
                o.constructor === My{baseType}";

            var engine = new Engine();
            Assert.True(engine.Evaluate(code).AsBoolean());
        }

        [Fact]
        public void ShouldHavePrototypeInPlaceByDefault()
        {
            var engine = new Engine();
            var instance = new JsObject(engine);
            Assert.NotNull(instance.GetPrototypeOf());
            Assert.Equal("[object Object]", instance.ToString());
        }
    }
}
