3 changed files with 171 additions and 20 deletions
@ -0,0 +1,140 @@
@@ -0,0 +1,140 @@
|
||||
//
|
||||
// SemanticHighlightingTests.cs
|
||||
//
|
||||
// Author:
|
||||
// Mike Krüger <mkrueger@xamarin.com>
|
||||
//
|
||||
// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
using System; |
||||
using ICSharpCode.NRefactory.CSharp.Resolver; |
||||
using ICSharpCode.NRefactory.TypeSystem; |
||||
using NUnit.Framework; |
||||
using System.Reflection; |
||||
using System.Text; |
||||
using System.Collections.Generic; |
||||
using ICSharpCode.NRefactory.Editor; |
||||
|
||||
namespace ICSharpCode.NRefactory.CSharp.Analysis |
||||
{ |
||||
[TestFixture] |
||||
public class SemanticHighlightingTests |
||||
{ |
||||
class TestSemanticHighlightingVisitor : SemanticHighlightingVisitor<FieldInfo> |
||||
{ |
||||
public TestSemanticHighlightingVisitor(CSharpAstResolver resolver) |
||||
{ |
||||
base.resolver = resolver; |
||||
this.regionStart = new TextLocation (1, 1); |
||||
this.regionEnd = new TextLocation (int.MaxValue, int.MaxValue); |
||||
var fields = typeof (TestSemanticHighlightingVisitor).GetFields (BindingFlags.NonPublic | BindingFlags.Instance); |
||||
foreach (var field in fields) { |
||||
if (field.FieldType == typeof (FieldInfo)) |
||||
field.SetValue (this, field); |
||||
} |
||||
} |
||||
|
||||
List<Tuple<DomRegion, string>> colors = new List<Tuple<DomRegion, string>> (); |
||||
|
||||
protected override void Colorize(TextLocation start, TextLocation end, FieldInfo color) |
||||
{ |
||||
colors.Add (Tuple.Create (new DomRegion (start, end), color != null ? color.Name : null)); |
||||
} |
||||
|
||||
public string GetColor(TextLocation loc) |
||||
{ |
||||
foreach (var color in colors) { |
||||
if (color.Item1.IsInside (loc)) |
||||
return color.Item2; |
||||
} |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
static TestSemanticHighlightingVisitor CreateHighighting (string text) |
||||
{ |
||||
var syntaxTree = SyntaxTree.Parse (text, "a.cs"); |
||||
if (syntaxTree.Errors.Count > 0) { |
||||
Console.WriteLine (text); |
||||
Assert.Fail ("parse error."); |
||||
} |
||||
var project = new CSharpProjectContent().AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); |
||||
var file = syntaxTree.ToTypeSystem(); |
||||
project = project.AddOrUpdateFiles(file); |
||||
|
||||
var resolver = new CSharpAstResolver(project.CreateCompilation(), syntaxTree, file); |
||||
var result = new TestSemanticHighlightingVisitor (resolver); |
||||
syntaxTree.AcceptVisitor (result); |
||||
return result; |
||||
} |
||||
|
||||
void TestColor(string text, string keywordColor) |
||||
{ |
||||
var sb = new StringBuilder (); |
||||
var offsets = new List<int> (); |
||||
foreach (var ch in text) { |
||||
if (ch == '$') { |
||||
offsets.Add (sb.Length); |
||||
continue; |
||||
} |
||||
sb.Append (ch); |
||||
} |
||||
var visitor = CreateHighighting (sb.ToString ()); |
||||
var doc = new ReadOnlyDocument (sb.ToString ()); |
||||
|
||||
foreach (var offset in offsets) { |
||||
var loc = doc.GetLocation (offset); |
||||
var color = visitor.GetColor (loc); |
||||
Assert.AreEqual (keywordColor, color, "Color at " + loc + " is wrong:" + color); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestValueInPropertySetter() |
||||
{ |
||||
TestColor (@"class Class { int Property { get {} set { test = $value; } } }", "valueKeywordColor"); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestValueInPropertyGetter() |
||||
{ |
||||
TestColor (@"class Class { int value; int Property { get { return $value; } set { } } }", "fieldAccessColor"); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestValueInCustomEvent() |
||||
{ |
||||
TestColor (@"using System;
|
||||
class Class { |
||||
public event EventHandler Property { |
||||
add { Console.WriteLine ($value); } |
||||
remove { Console.WriteLine ($value); } |
||||
} |
||||
}", "valueKeywordColor");
|
||||
} |
||||
|
||||
[Test] |
||||
public void TestExternAliasColor() |
||||
{ |
||||
TestColor (@"extern $alias FooBar;", "externAliasKeywordColor"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
Loading…
Reference in new issue