77 * of patent rights can be found in the PATENTS file in the same directory.
88 */
99
10+ using System ;
11+ using System . Collections . Generic ;
1012using Moq ;
1113using NUnit . Framework ;
1214using React . Exceptions ;
@@ -16,59 +18,138 @@ namespace React.Tests.Core
1618 [ TestFixture ]
1719 public class JsxTransformerTests
1820 {
21+ private Mock < IReactEnvironment > _environment ;
22+ private Mock < ICache > _cache ;
23+ private Mock < IFileSystem > _fileSystem ;
24+ private JsxTransformer _jsxTransformer ;
25+
26+ [ SetUp ]
27+ public void SetUp ( )
28+ {
29+ _environment = new Mock < IReactEnvironment > ( ) ;
30+ _environment . Setup ( x => x . EngineSupportsJsxTransformer ) . Returns ( true ) ;
31+
32+ _cache = new Mock < ICache > ( ) ;
33+ _fileSystem = new Mock < IFileSystem > ( ) ;
34+ _fileSystem . Setup ( x => x . MapPath ( It . IsAny < string > ( ) ) ) . Returns < string > ( x => x ) ;
35+
36+ _jsxTransformer = new JsxTransformer (
37+ _environment . Object ,
38+ _cache . Object ,
39+ _fileSystem . Object
40+ ) ;
41+ }
42+
1943 [ Test ]
2044 public void ShouldNotTransformJsxIfNoAnnotationPresent ( )
2145 {
22- var environment = new Mock < IReactEnvironment > ( ) ;
23- var cache = new Mock < ICache > ( ) ;
24- var fileSystem = new Mock < IFileSystem > ( ) ;
25- var jsxTransformer = new JsxTransformer (
26- environment . Object ,
27- cache . Object ,
28- fileSystem . Object
29- ) ;
3046 const string input = "<div>Hello World</div>" ;
3147
32- var output = jsxTransformer . TransformJsx ( input ) ;
48+ var output = _jsxTransformer . TransformJsx ( input ) ;
3349 Assert . AreEqual ( input , output ) ;
3450 }
3551
3652 [ Test ]
3753 public void ShouldTransformJsxIfAnnotationPresent ( )
3854 {
39- var environment = new Mock < IReactEnvironment > ( ) ;
40- var cache = new Mock < ICache > ( ) ;
41- var fileSystem = new Mock < IFileSystem > ( ) ;
42- var jsxTransformer = new JsxTransformer (
43- environment . Object ,
44- cache . Object ,
45- fileSystem . Object
46- ) ;
47- environment . Setup ( x => x . EngineSupportsJsxTransformer ) . Returns ( true ) ;
4855 const string input = "/** @jsx React.DOM */ <div>Hello World</div>" ;
49- jsxTransformer . TransformJsx ( input ) ;
56+ _jsxTransformer . TransformJsx ( input ) ;
5057
51- environment . Verify ( x => x . ExecuteWithLargerStackIfRequired < string > (
58+ _environment . Verify ( x => x . ExecuteWithLargerStackIfRequired < string > (
5259 @"global.JSXTransformer.transform(""/** @jsx React.DOM */ <div>Hello World</div>"").code"
5360 ) ) ;
5461 }
5562
63+ [ Test ]
64+ public void ShouldWrapExceptionsInJsxExeption ( )
65+ {
66+ _environment . Setup ( x => x . ExecuteWithLargerStackIfRequired < string > (
67+ @"global.JSXTransformer.transform(""/** @jsx React.DOM */ <div>Hello World</div>"").code"
68+ ) ) . Throws ( new Exception ( "Something broke..." ) ) ;
69+
70+ const string input = "/** @jsx React.DOM */ <div>Hello World</div>" ;
71+ Assert . Throws < JsxException > ( ( ) => _jsxTransformer . TransformJsx ( input ) ) ;
72+ }
73+
74+ [ Test ]
5675 public void ShouldThrowIfEngineNotSupported ( )
5776 {
58- var environment = new Mock < IReactEnvironment > ( ) ;
59- var cache = new Mock < ICache > ( ) ;
60- var fileSystem = new Mock < IFileSystem > ( ) ;
61- var jsxTransformer = new JsxTransformer (
62- environment . Object ,
63- cache . Object ,
64- fileSystem . Object
65- ) ;
66- environment . Setup ( x => x . EngineSupportsJsxTransformer ) . Returns ( false ) ;
77+ _environment . Setup ( x => x . EngineSupportsJsxTransformer ) . Returns ( false ) ;
6778
6879 Assert . Throws < JsxUnsupportedEngineException > ( ( ) =>
6980 {
70- jsxTransformer . TransformJsx ( "/** @jsx React.DOM */ <div>Hello world</div>" ) ;
81+ _jsxTransformer . TransformJsx ( "/** @jsx React.DOM */ <div>Hello world</div>" ) ;
7182 } ) ;
7283 }
84+
85+ [ Test ]
86+ public void ShouldUseCacheProvider ( )
87+ {
88+ _cache . Setup ( x => x . GetOrInsert (
89+ /*key*/ "JSX_foo.jsx" ,
90+ /*slidingExpiration*/ It . IsAny < TimeSpan > ( ) ,
91+ /*getData*/ It . IsAny < Func < string > > ( ) ,
92+ /*cacheDependencyKeys*/ It . IsAny < IEnumerable < string > > ( ) ,
93+ /*cacheDependencyFiles*/ It . IsAny < IEnumerable < string > > ( )
94+ ) ) . Returns ( "/* cached */" ) ;
95+
96+ var result = _jsxTransformer . TransformJsxFile ( "foo.jsx" ) ;
97+ Assert . AreEqual ( "/* cached */" , result ) ;
98+ }
99+
100+ [ Test ]
101+ public void ShouldUseFileSystemCache ( )
102+ {
103+ SetUpEmptyCache ( ) ;
104+ _fileSystem . Setup ( x => x . FileExists ( "foo.generated.js" ) ) . Returns ( true ) ;
105+ _fileSystem . Setup ( x => x . ReadAsString ( "foo.generated.js" ) ) . Returns ( "/* filesystem cached */" ) ;
106+
107+ var result = _jsxTransformer . TransformJsxFile ( "foo.jsx" ) ;
108+ Assert . AreEqual ( "/* filesystem cached */" , result ) ;
109+ }
110+
111+ [ Test ]
112+ public void ShouldTransformJsxIfNoCache ( )
113+ {
114+ SetUpEmptyCache ( ) ;
115+ _fileSystem . Setup ( x => x . FileExists ( "foo.generated.js" ) ) . Returns ( false ) ;
116+ _fileSystem . Setup ( x => x . ReadAsString ( "foo.jsx" ) ) . Returns ( "/** @jsx React.DOM */ <div>Hello World</div>" ) ;
117+
118+ _jsxTransformer . TransformJsxFile ( "foo.jsx" ) ;
119+ _environment . Verify ( x => x . ExecuteWithLargerStackIfRequired < string > (
120+ @"global.JSXTransformer.transform(""/** @jsx React.DOM */ <div>Hello World</div>"").code"
121+ ) ) ;
122+ }
123+
124+ [ Test ]
125+ public void ShouldSaveTransformationResult ( )
126+ {
127+ _fileSystem . Setup ( x => x . ReadAsString ( "foo.jsx" ) ) . Returns ( "/** @jsx React.DOM */ <div>Hello World</div>" ) ;
128+ _environment . Setup ( x => x . ExecuteWithLargerStackIfRequired < string > (
129+ @"global.JSXTransformer.transform(""/** @jsx React.DOM */ <div>Hello World</div>"").code"
130+ ) ) . Returns ( "React.DOM.div('Hello World')" ) ;
131+
132+ var result = _jsxTransformer . TransformAndSaveJsxFile ( "foo.jsx" ) ;
133+ Assert . AreEqual ( "foo.generated.js" , result ) ;
134+ _fileSystem . Verify ( x => x . WriteAsString ( "foo.generated.js" , "React.DOM.div('Hello World')" ) ) ;
135+ }
136+
137+ private void SetUpEmptyCache ( )
138+ {
139+ _cache . Setup ( x => x . GetOrInsert (
140+ /*key*/ "JSX_foo.jsx" ,
141+ /*slidingExpiration*/ It . IsAny < TimeSpan > ( ) ,
142+ /*getData*/ It . IsAny < Func < string > > ( ) ,
143+ /*cacheDependencyKeys*/ It . IsAny < IEnumerable < string > > ( ) ,
144+ /*cacheDependencyFiles*/ It . IsAny < IEnumerable < string > > ( )
145+ ) )
146+ . Returns ( (
147+ string key ,
148+ TimeSpan slidingExpiration ,
149+ Func < string > getData ,
150+ IEnumerable < string > cacheDependencyFiles ,
151+ IEnumerable < string > cacheDependencyKeys
152+ ) => getData ( ) ) ;
153+ }
73154 }
74155}
0 commit comments