// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.ui.dragdrop;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;

import org.chromium.url.GURL;
import org.chromium.url.JUnitTestGURLs;

/** Unit test for {@link DropDataAndroid}. */
@RunWith(RobolectricTestRunner.class)
public class DropDataAndroidUnitTest {
    private static final String IMAGE_FILENAME = "image.webp";

    @Test
    public void testPlainText() {
        final String text = "text";
        final DropDataAndroid data = DropDataAndroid.create(text, null, null, null, null);

        assertDragData(data, /*isPlainText=*/true, /*hasLink=*/false, /*hasImage=*/false);
        Assert.assertEquals("Text does not match.", text, data.text);
    }

    @Test
    public void testLink() {
        final String text = "text";
        final GURL gurl = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL);
        final DropDataAndroid data = DropDataAndroid.create(text, gurl, null, null, null);

        assertDragData(data, /*isPlainText=*/false, /*hasLink=*/true, /*hasImage=*/false);
        Assert.assertEquals("Link does not match.", gurl, data.gurl);
    }

    @Test
    public void testImage() {
        final byte[] img = new byte[] {1, 2};
        final String imageExtension = "webp";
        final DropDataAndroid data =
                DropDataAndroid.create("", null, img, imageExtension, IMAGE_FILENAME);

        assertDragData(data, /*isPlainText=*/false, /*hasLink=*/false, /*hasImage=*/true);
        Assert.assertEquals("Image content does not match.", img, data.imageContent);
        Assert.assertEquals(
                "Image extension does not match.", imageExtension, data.imageContentExtension);
        Assert.assertEquals("Image filename does not match.", IMAGE_FILENAME, data.imageFilename);
    }

    @Test
    public void testImageLink() {
        final GURL gurl = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL);
        final byte[] img = new byte[] {1, 2};
        final String imageExtension = "webp";
        final DropDataAndroid data =
                DropDataAndroid.create("", gurl, img, imageExtension, IMAGE_FILENAME);

        assertDragData(data, /*isPlainText=*/false, /*hasLink=*/true, /*hasImage=*/true);
        Assert.assertEquals("Link does not match.", gurl, data.gurl);
        Assert.assertEquals("Image content does not match.", img, data.imageContent);
        Assert.assertEquals(
                "Image extension does not match.", imageExtension, data.imageContentExtension);
        Assert.assertEquals("Image filename does not match.", IMAGE_FILENAME, data.imageFilename);
    }

    private void assertDragData(
            DropDataAndroid data, boolean isPlainText, boolean hasLink, boolean hasImage) {
        Assert.assertEquals("#isPlainText check failed.", isPlainText, data.isPlainText());
        Assert.assertEquals("#hasLink check failed.", hasLink, data.hasLink());
        Assert.assertEquals("#hasImage check failed.", hasImage, data.hasImage());
    }
}
