package com.mobify.astro.utilities;

import android.net.Uri;
import android.support.test.InstrumentationRegistry;

import com.mobify.astro.R;

import org.junit.Test;

import java.net.URISyntaxException;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

public class AstroFileUtilitiesTest {

    Uri fileUri = Uri.parse("file:///img2.png");
    Uri uriWithDirectories = Uri.parse("file:///dir1/dir2/img3.png");
    Uri uriNoLeadingSlash = Uri.parse("file://img4.png");
    Uri webUri = Uri.parse("http://ab/cd/ef/egf.html");
    Uri secureWebUri = Uri.parse("https://ab/cd/ef/egf.html");
    Uri fileUriNoExtension = Uri.parse("file:///some_great_resource");
    Uri invalidUri = Uri.parse("file://hi/i/am/cool");
    Uri drawableUri = Uri.parse("file:///ic_launcher.png");

    @Test
    public void testIsFileUri() {
        assertTrue(AstroFileUtilities.isFileUri(fileUri));
        assertFalse(AstroFileUtilities.isFileUri(webUri));
        assertFalse(AstroFileUtilities.isFileUri(secureWebUri));
    }

    @Test
    public void testIsFileUriValid() {
        assertTrue(AstroFileUtilities.isValidFileUri(fileUri));
        assertTrue(AstroFileUtilities.isValidFileUri(uriWithDirectories));
        assertFalse(AstroFileUtilities.isValidFileUri(uriNoLeadingSlash));
        assertFalse(AstroFileUtilities.isValidFileUri(webUri));
        assertFalse(AstroFileUtilities.isValidFileUri(invalidUri));
    }

    @Test
    public void testGetAndroidAssetPath() throws Exception {
        assertEquals("img2.png", AstroFileUtilities.getAndroidAssetPath(fileUri));
        assertEquals("dir1/dir2/img3.png", AstroFileUtilities.getAndroidAssetPath(uriWithDirectories));
    }

    @Test
    public void testGetAndroidAssetPathThrows() throws Exception {
        try {
            AstroFileUtilities.getAndroidAssetPath(uriNoLeadingSlash);
            fail("Exception should have been thrown");
        } catch(URISyntaxException e) {
            assertEquals("Invalid Astro file Uri: file://img4.png", e.getMessage());
        }
    }

    @Test
    public void testCreateAndroidAssetUri() throws Exception {
        Uri uriResult = Uri.parse("file:///android_asset/img2.png");
        Uri uriWithDirectoriesResult = Uri.parse("file:///android_asset/dir1/dir2/img3.png");

        assertEquals(uriResult,
                AstroFileUtilities.createAndroidAssetUri(fileUri));
        assertEquals(uriWithDirectoriesResult,
                AstroFileUtilities.createAndroidAssetUri(uriWithDirectories));
    }

    @Test
    public void testCreateAndroidAssetUriThrows() throws Exception {
        try {
            AstroFileUtilities.createAndroidAssetUri(uriNoLeadingSlash);
            fail("Exception should have been thrown");
        } catch(URISyntaxException e) {
            assertEquals("Invalid Astro file Uri: file://img4.png", e.getMessage());
        }
    }

    @Test
    public void testGetAndroidResourceDrawableUri() throws Exception {
        Uri androidResourceUriResult =
                AstroFileUtilities.getAndroidResourceDrawableUri(fileUri, "com.mobify.astro");
        Uri androidResourceUriWithDirectoriesResult =
                AstroFileUtilities.getAndroidResourceDrawableUri(uriWithDirectories, "com.mobify.astro");
        Uri androidResourceUriNoExtensionResult =
                AstroFileUtilities.getAndroidResourceDrawableUri(fileUriNoExtension, "com.mobify.astro");

        assertEquals("android.resource://com.mobify.astro/drawable/img2",
                androidResourceUriResult.toString());
        assertEquals("android.resource://com.mobify.astro/drawable/img3",
                androidResourceUriWithDirectoriesResult.toString());
        assertEquals("android.resource://com.mobify.astro/drawable/some_great_resource",
                androidResourceUriNoExtensionResult.toString());
    }

    @Test
    public void testGetAndroidResourceDrawableUriThrows() throws Exception {
        try {
            AstroFileUtilities.getAndroidResourceDrawableUri(uriNoLeadingSlash, "com.mobify.astro");
            fail("Exception should have been thrown");
        } catch(URISyntaxException e) {
            assertEquals("Invalid Astro file Uri: file://img4.png", e.getMessage());
        }
    }

    @Test
    public void getAndroidResourceDrawableIdentifierValidResource() throws Exception {
        int resourceId = AstroFileUtilities.getAndroidResourceDrawableIdentifier(InstrumentationRegistry.getTargetContext(), drawableUri);
        assertEquals(R.drawable.ic_launcher, resourceId);
    }

    @Test
    public void getAndroidResourceDrawableIdentifierInvalidResource() throws Exception {
        int resourceId = AstroFileUtilities.getAndroidResourceDrawableIdentifier(InstrumentationRegistry.getTargetContext(), fileUri);
        assertEquals(0, resourceId);
    }

    @Test
    public void getAndroidResourceDrawableIdentifierThrows() throws Exception {
        try {
            AstroFileUtilities.getAndroidResourceDrawableIdentifier(InstrumentationRegistry.getTargetContext(), uriNoLeadingSlash);
            fail("Exception should have been thrown");
        } catch(URISyntaxException e) {
            assertEquals("Invalid Astro file Uri: file://img4.png", e.getMessage());
        }
    }

}
