@@ -6,7 +6,7 @@ var path = require('path');
66var util = require ( 'util' ) ;
77var generators = require ( 'yeoman-generator' ) ;
88var helpers = require ( 'yeoman-generator' ) . test ;
9-
9+ var _ = require ( 'underscore.string' ) ;
1010
1111describe ( 'Angular generator' , function ( ) {
1212 var angular ;
@@ -101,26 +101,93 @@ describe('Angular generator', function () {
101101 } ) ;
102102 } ) ;
103103
104+ /**
105+ * Generic test function that can be used to cover the scenarios where a generator is creating both a source file
106+ * and a test file. The function will run the respective generator, and then check for the existence of the two
107+ * generated files. A RegExp check is done on each file, checking for the generated content with a pattern.
108+ *
109+ * The number of parameters is quite huge due to the many options in which the generated files differ,
110+ * e.g. Services start with an upper case letter, whereas filters, directives or constants start with a lower case
111+ * letter.
112+ *
113+ * The generated items all use the dummy name 'foo'.
114+ *
115+ * @param generatorType The type of generator to run, e.g. 'filter'.
116+ * @param specType The type of the generated spec file, e.g. 'service' - all service types (constant, value, ...)
117+ * use the same Service spec template.
118+ * @param targetDirectory The directory into which the files are generated, e.g. 'directives' - this will be
119+ * located under 'app/scripts' for the sources and 'test/spec' for the tests.
120+ * @param scriptNameFn The function used to create the name of the created item, e.g. _.classify to generate 'Foo',
121+ * or _.camelize to generate 'foo'.
122+ * @param specNameFn Same as scriptNameFn, but for the describe text used in the Spec file. Some generators use
123+ * _.classify, others use _.camelize.
124+ * @param suffix An optional suffix to be appended to the generated item name, e.g. 'Ctrl' for controllers, which
125+ * will generate 'FooCtrl'.
126+ * @param done The done function.
127+ */
128+ function generatorTest ( generatorType , specType , targetDirectory , scriptNameFn , specNameFn , suffix , done ) {
129+ var angularGenerator ;
130+ var name = 'foo' ;
131+ var deps = [ path . join ( '../..' , generatorType ) ] ;
132+ angularGenerator = helpers . createGenerator ( 'angular:' + generatorType , deps , [ name ] ) ;
133+
134+ helpers . mockPrompt ( angular , {
135+ bootstrap : true ,
136+ compassBoostrap : true ,
137+ modules : [ ]
138+ } ) ;
139+ angular . run ( [ ] , function ( ) {
140+ angularGenerator . run ( [ ] , function ( ) {
141+ helpers . assertFiles ( [
142+ [ path . join ( 'app/scripts' , targetDirectory , name + '.js' ) , new RegExp ( generatorType + '\\(\'' + scriptNameFn ( name ) + suffix + '\'' , 'g' ) ] ,
143+ [ path . join ( 'test/spec' , targetDirectory , name + '.js' ) , new RegExp ( 'describe\\(\'' + _ . classify ( specType ) + ': ' + specNameFn ( name ) + suffix + '\'' , 'g' ) ]
144+ ] ) ;
145+ done ( ) ;
146+ } ) ;
147+ } ) ;
148+ }
149+
104150 describe ( 'Controller' , function ( ) {
105151 it ( 'should generate a new controller' , function ( done ) {
106- var angularCtrl ;
107- var deps = [ '../../controller' ] ;
108- angularCtrl = helpers . createGenerator ( 'angular:controller' , deps , [ 'foo' ] ) ;
152+ generatorTest ( 'controller' , 'controller' , 'controllers' , _ . classify , _ . classify , 'Ctrl' , done ) ;
153+ } ) ;
154+ } ) ;
109155
110- helpers . mockPrompt ( angular , {
111- bootstrap : true ,
112- compassBoostrap : true ,
113- modules : [ ]
114- } ) ;
115- angular . run ( [ ] , function ( ) {
116- angularCtrl . run ( [ ] , function ( ) {
117- helpers . assertFiles ( [
118- [ 'app/scripts/controllers/foo.js' , / c o n t r o l l e r \( ' F o o C t r l ' / ] ,
119- [ 'test/spec/controllers/foo.js' , / d e s c r i b e \( ' C o n t r o l l e r : F o o C t r l ' / ]
120- ] ) ;
121- done ( ) ;
122- } ) ;
123- } ) ;
156+ describe ( 'Directive' , function ( ) {
157+ it ( 'should generate a new directive' , function ( done ) {
158+ generatorTest ( 'directive' , 'directive' , 'directives' , _ . camelize , _ . camelize , '' , done ) ;
159+ } ) ;
160+ } ) ;
161+
162+ describe ( 'Filter' , function ( ) {
163+ it ( 'should generate a new filter' , function ( done ) {
164+ generatorTest ( 'filter' , 'filter' , 'filters' , _ . camelize , _ . camelize , '' , done ) ;
165+ } ) ;
166+ } ) ;
167+
168+ describe ( 'Service' , function ( ) {
169+ function serviceTest ( generatorType , nameFn , done ) {
170+ generatorTest ( generatorType , 'service' , 'services' , nameFn , _ . classify , '' , done ) ;
171+ } ;
172+
173+ it ( 'should generate a new constant' , function ( done ) {
174+ serviceTest ( 'constant' , _ . camelize , done ) ;
175+ } ) ;
176+
177+ it ( 'should generate a new service' , function ( done ) {
178+ serviceTest ( 'service' , _ . classify , done ) ;
179+ } ) ;
180+
181+ it ( 'should generate a new factory' , function ( done ) {
182+ serviceTest ( 'factory' , _ . camelize , done ) ;
183+ } ) ;
184+
185+ it ( 'should generate a new provider' , function ( done ) {
186+ serviceTest ( 'provider' , _ . camelize , done ) ;
187+ } ) ;
188+
189+ it ( 'should generate a new value' , function ( done ) {
190+ serviceTest ( 'value' , _ . camelize , done ) ;
124191 } ) ;
125192 } ) ;
126193
0 commit comments