1+ //
2+ // Copyright (c) .NET Foundation and Contributors
3+ // See LICENSE file in the project root for full license information.
4+ //
5+
6+ using System ;
7+ using System . Collections . Generic ;
8+ using System . IO ;
9+ using Microsoft . VisualStudio . TestTools . UnitTesting ;
10+ using Mono . Cecil ;
11+ using nanoFramework . Tools . MetadataProcessor . Core ;
12+
13+ namespace nanoFramework . Tools . MetadataProcessor . Tests . Core
14+ {
15+ [ TestClass ]
16+ public class StubsGenerationTests
17+ {
18+ private const string NativeMethodGenerationDeclaration = @"void NativeMethodGeneration::NativeMethodWithReferenceParameters( uint8_t& param0, uint16_t& param1, HRESULT &hr )
19+ {
20+
21+ (void)param0;
22+ (void)param1;
23+ (void)hr;
24+
25+
26+ ////////////////////////////////
27+ // implementation starts here //
28+
29+
30+ // implementation ends here //
31+ ////////////////////////////////
32+
33+
34+ }" ;
35+
36+ [ TestMethod ]
37+ public void GeneratingStubsFromNFAppTest ( )
38+ {
39+ var loadHints = new Dictionary < string , string > ( StringComparer . Ordinal )
40+ {
41+ [ "mscorlib" ] = Path . Combine ( Directory . GetParent ( TestObjectHelper . GenerationNFAppFullPath ) . FullName ,
42+ "mscorlib.dll" )
43+ } ;
44+
45+ // class names to exclude from processing
46+ var classNamesToExclude = new List < string >
47+ {
48+ "THIS_NAME_DOES_NOT_EXIST_IN_THE_PROJECT"
49+ } ;
50+
51+ var fileToParse = TestObjectHelper . GenerationNFAppFullPath ;
52+ var fileToCompile = Path . ChangeExtension ( fileToParse , "pe" ) ;
53+
54+ // get path where stubs will be generated
55+ var stubPath = Path . Combine (
56+ TestObjectHelper . TestExecutionLocation ,
57+ "Stubs" ) ;
58+
59+ var assemblyDefinition = AssemblyDefinition . ReadAssembly (
60+ fileToParse ,
61+ new ReaderParameters { AssemblyResolver = new LoadHintsAssemblyResolver ( loadHints ) } ) ;
62+
63+ var assemblyBuilder = new nanoAssemblyBuilder ( assemblyDefinition , classNamesToExclude , false , false ) ;
64+
65+ using ( var stream = File . Open (
66+ Path . ChangeExtension ( fileToCompile , "tmp" ) ,
67+ FileMode . Create ,
68+ FileAccess . ReadWrite ) )
69+ using ( var writer = new BinaryWriter ( stream ) )
70+ {
71+ assemblyBuilder . Write ( GetBinaryWriter ( writer ) ) ;
72+ }
73+
74+ // OK to delete tmp PE file
75+ File . Delete ( Path . ChangeExtension ( fileToCompile , "tmp" ) ) ;
76+
77+ assemblyBuilder . Minimize ( ) ;
78+
79+ var tablesContext = assemblyBuilder . TablesContext ;
80+
81+ var skeletonGenerator = new nanoSkeletonGenerator (
82+ tablesContext ,
83+ stubPath ,
84+ "testStubs" ,
85+ "StubsGenerationTestNFApp" ,
86+ false ,
87+ false ) ;
88+
89+ skeletonGenerator . GenerateSkeleton ( ) ;
90+
91+ // read generated stub file and look for the function declaration
92+ string generatedFile = File . ReadAllText ( $ "{ stubPath } \\ StubsGenerationTestNFApp_StubsGenerationTestNFApp_NativeMethodGeneration.cpp") ;
93+
94+ Assert . IsTrue ( generatedFile . Contains ( NativeMethodGenerationDeclaration ) ) ;
95+
96+ Directory . Delete ( stubPath , true ) ;
97+ }
98+
99+ private nanoBinaryWriter GetBinaryWriter (
100+ BinaryWriter writer )
101+ {
102+ return nanoBinaryWriter . CreateLittleEndianBinaryWriter ( writer ) ;
103+ }
104+ }
105+ }
0 commit comments