public void ConcatenationAllocation_Basic()
        {
            var sampleProgram =
            @"using System;

            var withBoxing = 5.ToString() + ':' + 8.ToString(); // Boxing on ':'
            var withoutBoxing = 5.ToString() + "":"" + 8.ToString();
            ";

            var analyser = new ConcatenationAllocationAnalyzer();
            var info = ProcessCode(analyser, sampleProgram, ImmutableArray.Create(SyntaxKind.AddExpression, SyntaxKind.AddAssignmentExpression));

            Assert.AreEqual(1, info.Allocations.Count(d => d.Id == "HeapAnalyzerBoxingRule"));
            Assert.AreEqual(4, info.Allocations.Count(d => d.Id == "HeapAnalyzerStringConcatRule"));

            //### CODE ### 5.ToString() + ':' + 8.ToString()
            //*** Diagnostic: (9,45): warning HeapAnalyzerBoxingRule: Value type (char) is being boxed to a reference type for a string concatenation.
            AssertEx.ContainsDiagnostic(info.Allocations, id: ConcatenationAllocationAnalyzer.ValueTypeToReferenceTypeInAStringConcatenationRule.Id, line: 3, character: 33);
            // Diagnostic: (9,43): warning HeapAnalyzerStringConcatRule: Considering using StringBuilder
            AssertEx.ContainsDiagnostic(info.Allocations, id: ConcatenationAllocationAnalyzer.StringConcatenationAllocationRule.Id, line: 3, character: 31);
            // Diagnostic: (9,49): warning HeapAnalyzerStringConcatRule: Considering using StringBuilder
            AssertEx.ContainsDiagnostic(info.Allocations, id: ConcatenationAllocationAnalyzer.StringConcatenationAllocationRule.Id, line: 3, character: 37);

            //### CODE ### 5.ToString() + ":" + 8.ToString()
            // Diagnostic: (10,46): warning HeapAnalyzerStringConcatRule: Considering using StringBuilder
            AssertEx.ContainsDiagnostic(info.Allocations, id: ConcatenationAllocationAnalyzer.StringConcatenationAllocationRule.Id, line: 4, character: 34);
            // Diagnostic: (10,52): warning HeapAnalyzerStringConcatRule: Considering using StringBuilder
            AssertEx.ContainsDiagnostic(info.Allocations, id: ConcatenationAllocationAnalyzer.StringConcatenationAllocationRule.Id, line: 4, character: 40);
        }
 public void Non_constant_value_types_in_CSharp_string_concatenation()
 {
     var @script =
         @"char c = 'c'; //F();
         string s1 = ""char value will box"" + c;";
     var analyser = new ConcatenationAllocationAnalyzer();
     var info = ProcessCode(analyser, @script, ImmutableArray.Create(SyntaxKind.AddExpression, SyntaxKind.AddAssignmentExpression));
     Assert.AreEqual(2, info.Allocations.Count);
     //Diagnostic: (2,53): warning HeapAnalyzerBoxingRule: Value type (char) is being boxed to a reference type for a string concatenation.
     AssertEx.ContainsDiagnostic(info.Allocations, ConcatenationAllocationAnalyzer.ValueTypeToReferenceTypeInAStringConcatenationRule.Id, line: 2, character: 53);
     //Diagnostic: (2,51): warning HeapAnalyzerStringConcatRule: Considering using StringBuilder
     AssertEx.ContainsDiagnostic(info.Allocations, ConcatenationAllocationAnalyzer.StringConcatenationAllocationRule.Id, line: 2, character: 51);
 }