﻿using Lucene.Net.CodeAnalysis.Dev;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Diagnostics;
using NUnit.Framework;
using TestHelper;

namespace Lucene.Net.Tests.CodeAnalysis.Dev
{
    public class TestLuceneDev1003_ArrayMethodParameterCSCodeAnalyzer : DiagnosticVerifier
    {
        protected override DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer()
        {
            return new LuceneDev1003_ArrayMethodParameterCSCodeAnalyzer();
        }

        //No diagnostics expected to show up
        [Test]
        public void TestEmptyFile()
        {
            var test = @"";

            VerifyCSharpDiagnostic(test);
        }

        [Test]
        public void TestDiagnostic_ParseChar_String_Int32Array_Char()
        {
            var test = @"
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
        using System.Diagnostics;

        public class MyClass
        {
            public static bool ParseChar(string id, int[] pos, char ch)
            {
                int start = pos[0];
                pos[0] = PatternProps.SkipWhiteSpace(id, pos[0]);
                if (pos[0] == id.Length ||
                    id[pos[0]] != ch)
                {
                    pos[0] = start;
                    return false;
                }
                ++pos[0];
                return true;
            }
        }
       ";

            var expected = new DiagnosticResult
            {
                Id = LuceneDev1003_ArrayMethodParameterCSCodeAnalyzer.DiagnosticId,
                Message = string.Format("'{0}' needs to be analyzed to determine whether the array can be replaced with a ref or out parameter.", "int[] pos"),
                Severity = DiagnosticSeverity.Warning,
                Locations =
                    new[] {
                                    new DiagnosticResultLocation("Test0.cs", 11, 53)
                        }
            };

            VerifyCSharpDiagnostic(test, expected);
        }

        [Test]
        public void TestDiagnostic_ParseChar_String_CharArray_Char()
        {
            var test = @"
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
        using System.Diagnostics;

        public class MyClass
        {
            public static bool ParseChar(string id, char[] pos, char ch)
            {
                int start = pos[0];
                pos[0] = PatternProps.SkipWhiteSpace(id, pos[0]);
                if (pos[0] == id.Length ||
                    id[pos[0]] != ch)
                {
                    pos[0] = start;
                    return false;
                }
                ++pos[0];
                return true;
            }
        }
       ";

            // We shouldn't trigger a warning on char[]
            VerifyCSharpDiagnostic(test);
        }
    }
}
