1#!/usr/bin/env node
2
3const fs = require('fs');
4const path = require('path');
5
6function capitalize(string) {
7  return string.charAt(0).toUpperCase() + string.slice(1);
8}
9
10function convertToUpperCamelCase(string) {
11  return string
12    .split('-')
13    .map(word => capitalize(word))
14    .join('');
15}
16
17function regexFile(regex, replace, filePath) {
18  const file = fs.readFileSync(filePath, 'utf8');
19  fs.writeFileSync(filePath, file.replace(regex, replace));
20}
21
22const testFixturesDir = path.join(__dirname, '../TestFixtures');
23const testFiles = fs.readdirSync(testFixturesDir);
24
25const tests = {};
26for (const fileName of testFiles) {
27  const name = convertToUpperCamelCase(fileName.split('.')[0]);
28  const jsonString = fs.readFileSync(path.join(testFixturesDir, fileName), 'utf8');
29  const json = JSON.parse(jsonString);
30  tests[name] = json;
31}
32
33// EXStructuredHeadersTestFixtures.h
34const generatedConstantHeaders = `// GENERATED CONSTANTS BEGIN
35
36${Object.keys(tests)
37  .map(name => `FOUNDATION_EXPORT NSString * const EXStructuredHeaders${name}Tests;`)
38  .join('\n')}
39
40// GENERATED CONSTANTS END`;
41regexFile(
42  /\/\/ GENERATED CONSTANTS BEGIN\n[\s\S]*\n\/\/ GENERATED CONSTANTS END/,
43  generatedConstantHeaders,
44  path.join(__dirname, '../EXStructuredHeadersTestFixtures.h')
45);
46
47// EXStructuredHeadersTestFixtures.m
48const generatedConstantsImpl = `// GENERATED CONSTANTS BEGIN
49
50${Object.entries(tests)
51  .map(
52    ([name, json]) =>
53      `NSString * const EXStructuredHeaders${name}Tests = @${JSON.stringify(JSON.stringify(json))};`
54  )
55  .join('\n\n')}
56
57// GENERATED CONSTANTS END`;
58regexFile(
59  /\/\/ GENERATED CONSTANTS BEGIN\n[\s\S]*\n\/\/ GENERATED CONSTANTS END/,
60  generatedConstantsImpl,
61  path.join(__dirname, '../EXStructuredHeadersTestFixtures.m')
62);
63
64// EXStructuredHeadersParserTests.m'
65const generatedXCTests = `// GENERATED TESTS BEGIN
66
67${Object.keys(tests)
68  .map(
69    name => `- (void)test${name}
70{
71  [self runTests:EXStructuredHeaders${name}Tests];
72}`
73  )
74  .join('\n\n')}
75
76@end`;
77regexFile(
78  /\/\/ GENERATED TESTS BEGIN\n[\s\S]*\n@end/,
79  generatedXCTests,
80  path.join(__dirname, '../EXStructuredHeadersParserTests.m')
81);
82