public void GetSkippedBlocks_IfSingleElifDirectiveWithElifDirectiveFalse_SkippedBlockIncludesElifBlock() { File.WriteAllText(sourceFilePath, @"#define X 1 #define Y 0 #define Z 0 #if X #define foo x*y #elif Z + 0 #define foo x+y #elif Y #define foo x/y #elif Z #define foo x-y #endif "); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { var skippedBlocks = preprocessor.GetSkippedBlockLineNumbers(); var skippedBlock = skippedBlocks.First(); Assert.AreEqual(6, skippedBlock.Item1); Assert.AreEqual(12, skippedBlock.Item2); } }
public void GetSkippedBlocks_TwoIfBlocksBothFalse_SkippedBlockIncludesBothBlocks() { File.WriteAllText(sourceFilePath, @"#if 0 #define foo x+y #endif #if 0 #define foo x-y #endif "); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { var skippedBlocks = preprocessor.GetSkippedBlockLineNumbers(); var skippedBlock = skippedBlocks.First(); Assert.AreEqual(1, skippedBlock.Item1); Assert.AreEqual(3, skippedBlock.Item2); skippedBlock = skippedBlocks.ElementAt(1); Assert.AreEqual(4, skippedBlock.Item1); Assert.AreEqual(6, skippedBlock.Item2); } }
public void GetSkippedBlocks_IfMultipleElifDirectiveWithIfDirectiveFalseAndSecondElifDirectiveTrue_SkippedBlockIncludesSecondElifBlock() { File.WriteAllText(sourceFilePath, @"#define X 0 #define Y 0 #define Z 2 #if X #define foo x*y #elif Y #define foo x/y #elif Z #define foo x-y #endif "); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { var skippedBlocks = preprocessor.GetSkippedBlockLineNumbers(); var skippedBlock = skippedBlocks.First(); Assert.AreEqual(4, skippedBlock.Item1); Assert.AreEqual(8, skippedBlock.Item2); } }
public void GetSkippedBlocks_IfDefinedBlockWithDefinedMacro_SkippedBlockIncludesIfDefinedBlock() { File.WriteAllText(sourceFilePath, @"#if defined(__GNUC__) # include <avr/io.h> #elif defined(__ICCAVR__) # include <ioavr.h> # include <intrinsics.h> #else # error Unsupported compiler. #endif"); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { var skippedBlocks = preprocessor.GetSkippedBlockLineNumbers(); var skippedBlock = skippedBlocks.First(); Assert.AreEqual(4, skippedBlock.Item1); Assert.AreEqual(5, skippedBlock.Item2); skippedBlock = skippedBlocks.ElementAt(1); Assert.AreEqual(7, skippedBlock.Item1); Assert.AreEqual(7, skippedBlock.Item2); } }
void AssertSkippedBlocksMatch(ClangAdapter adapter, IEnumerable <Tuple <int, int> > expected) { var preprocessor = adapter.GetPreprocessor(); var skippedBlockLineNumbers = preprocessor.GetSkippedBlockLineNumbers(); Assert.AreEqual(expected.Count(), skippedBlockLineNumbers.Count()); for (int i = 0; i < expected.Count(); ++i) { Assert.AreEqual(expected.ElementAt(i), skippedBlockLineNumbers.ElementAt(i)); } }
public void ExpandMacro_MacroDefinitionIncludesAnotherMacro_ExpansionExpandsInnerMacro() { File.WriteAllText(sourceFilePath, @" #define x 2 #define foo x*y "); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { Assert.AreEqual("2*y", preprocessor.ExpandMacro("foo")); } }
public void GetSkippedBlocks_IfDefinedBlockWithUndefinedMacro_SkippedBlockIncludesIfDefinedBlock() { File.WriteAllText(sourceFilePath, @"#if defined(OOLALALA) # include <avr/io.h> #endif"); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { var skippedBlocks = preprocessor.GetSkippedBlockLineNumbers(); var skippedBlock = skippedBlocks.First(); Assert.AreEqual(1, skippedBlock.Item1); Assert.AreEqual(3, skippedBlock.Item2); } }
public void GetSkippedBlocks_IfBlockWithMultiplePreprocessorDefinitions_SkippedBlockIncludesAllLines() { File.WriteAllText(sourceFilePath, @"#if 0 #define foo x+y #define fat boo #define fal laf #endif "); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { var skippedBlocks = preprocessor.GetSkippedBlockLineNumbers(); var skippedBlock = skippedBlocks.First(); Assert.AreEqual(2, skippedBlock.Item1); Assert.AreEqual(4, skippedBlock.Item2); } }
public void GetSkippedBlocks_IfBlockWithMultiplePreprocessorDefinitions_SkippedBlockIncludesAllLines() { File.WriteAllText(sourceFilePath, @"#if 0 #define foo x+y #define fat boo #define fal laf #endif "); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { var skippedBlocks = preprocessor.GetSkippedBlockLineNumbers(); var skippedBlock = skippedBlocks.First(); Assert.AreEqual(1, skippedBlock.Item1); Assert.AreEqual(5, skippedBlock.Item2); } }
public void GetSkippedBlocks_IfBlockWithMultiplePreprocessorDefinitionsIsTrue_SkippedBlockIsEmpty() { File.WriteAllText(sourceFilePath, @"#if 1 #define foo x+y #define fat boo #define fal laf #endif int x = 20; #if 1 #define foo x+y #define fat boo #define fal laf #endif "); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { var skippedBlocks = preprocessor.GetSkippedBlockLineNumbers(); Assert.IsFalse(skippedBlocks.Any()); } }
public void GetSkippedBlocks_IfElseBlockWithElseBlockExcludedAndCodeTypedBeforeBlock_SkippedBlockIncludesExcludedCode() { var mainCode = @"#if BLAH #define foo x+y #define bar x-y #else #define fal laf #endif"; File.WriteAllText(sourceFilePath, mainCode); var adapter = new ClangAdapter(sourceFilePath); var preprocessor = adapter.GetPreprocessor(); adapter.Process(mainCode); AssertSkippedBlocksMatch(adapter, new[] { Tuple.Create(3, 4) }); var initialText = "#define BLAH 0" + Environment.NewLine + mainCode; adapter.Process(initialText); AssertSkippedBlocksMatch(adapter, new[] { Tuple.Create(3, 4) }); var laterText = "#define BLAH 2" + Environment.NewLine + mainCode; adapter.Process(laterText); AssertSkippedBlocksMatch(adapter, new[] { Tuple.Create(6, 6) }); adapter.Process(initialText); AssertSkippedBlocksMatch(adapter, new[] { Tuple.Create(3, 4) }); adapter.Process(laterText); AssertSkippedBlocksMatch(adapter, new[] { Tuple.Create(6, 6) }); adapter.Process(initialText); AssertSkippedBlocksMatch(adapter, new[] { Tuple.Create(3, 4) }); }
public void GetSkippedBlocks_IfDefinedBlockWithUndefinedMacro_SkippedBlockIncludesIfDefinedBlock() { File.WriteAllText(sourceFilePath, @"#if defined(OOLALALA) # include <avr/io.h> #endif"); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { var skippedBlocks = preprocessor.GetSkippedBlockLineNumbers(); var skippedBlock = skippedBlocks.First(); Assert.AreEqual(2, skippedBlock.Item1); Assert.AreEqual(2, skippedBlock.Item2); } }
void AssertSkippedBlocksMatch(ClangAdapter adapter, IEnumerable<Tuple<int, int>> expected) { var preprocessor = adapter.GetPreprocessor(); var skippedBlockLineNumbers = preprocessor.GetSkippedBlockLineNumbers(); Assert.AreEqual(expected.Count(), skippedBlockLineNumbers.Count()); for (int i = 0; i < expected.Count(); ++i) { Assert.AreEqual(expected.ElementAt(i), skippedBlockLineNumbers.ElementAt(i)); } }
public void GetSkippedBlocks_TwoIfBlocksBothFalse_SkippedBlockIncludesBothBlocks() { File.WriteAllText(sourceFilePath, @"#if 0 #define foo x+y #endif #if 0 #define foo x-y #endif "); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { var skippedBlocks = preprocessor.GetSkippedBlockLineNumbers(); var skippedBlock = skippedBlocks.First(); Assert.AreEqual(2, skippedBlock.Item1); Assert.AreEqual(2, skippedBlock.Item2); skippedBlock = skippedBlocks.ElementAt(1); Assert.AreEqual(5, skippedBlock.Item1); Assert.AreEqual(5, skippedBlock.Item2); } }
public void GetSkippedBlocks_IfSingleElifDirectiveWithElifDirectiveFalse_SkippedBlockIncludesElifBlock() { File.WriteAllText(sourceFilePath, @"#define X 1 #define Y 0 #define Z 0 #if X #define foo x*y #elif Z + 0 #define foo x+y #elif Y #define foo x/y #elif Z #define foo x-y #endif "); var adapter = new ClangAdapter(sourceFilePath); adapter.Process(null); var preprocessor = adapter.GetPreprocessor(); { var skippedBlocks = preprocessor.GetSkippedBlockLineNumbers(); var skippedBlock = skippedBlocks.First(); Assert.AreEqual(7, skippedBlock.Item1); Assert.AreEqual(7, skippedBlock.Item2); skippedBlock = skippedBlocks.ElementAt(1); Assert.AreEqual(9, skippedBlock.Item1); Assert.AreEqual(9, skippedBlock.Item2); skippedBlock = skippedBlocks.ElementAt(2); Assert.AreEqual(11, skippedBlock.Item1); Assert.AreEqual(11, skippedBlock.Item2); } }