Advertisement
Guest User

Untitled

a guest
Nov 30th, 2015
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.12 KB | None | 0 0
  1. import { check, gen, property } from 'testcheck';
  2. import generate from 'babel-generator'
  3. import babel from 'babel-core';
  4.  
  5. const genTrue = gen.suchThat((v) => v, gen.boolean);
  6. const genFalse = gen.suchThat((v) => !v, gen.boolean);
  7.  
  8. const letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
  9. 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
  10.  
  11. const genAlphaString = gen.suchThat(
  12. (v) => letters.indexOf(v[0].toLowerCase()) !== -1,
  13. gen.notEmpty(gen.alphaNumString)
  14. );
  15.  
  16. function Identifier() {
  17. return gen.object({
  18. type: gen.return('Identifier'),
  19. name: genAlphaString
  20. });
  21. }
  22.  
  23. function StringLiteral() {
  24. return gen.object({
  25. type: gen.return('StringLiteral'),
  26. value: gen.alphaNumString
  27. });
  28. }
  29.  
  30. function BooleanLiteral() {
  31. return gen.object({
  32. type: gen.return('BooleanLiteral'),
  33. value: gen.boolean
  34. });
  35. }
  36.  
  37. function VariableDeclarator() {
  38. return gen.object({
  39. type: gen.return('VariableDeclarator'),
  40. id: Identifier(),
  41. init: gen.oneOf([
  42. ArrowFunctionExpression()
  43. ])
  44. });
  45. }
  46.  
  47. function VariableDeclaration() {
  48. return gen.object({
  49. type: gen.return('VariableDeclaration'),
  50. declarations: gen.array(VariableDeclarator(), 1),
  51. kind: gen.returnOneOf(['var', 'let', 'const']),
  52. });
  53. }
  54.  
  55. function ArrowFunctionExpression() {
  56. return gen.object({
  57. type: gen.return('ArrowFunctionExpression'),
  58. id: gen.null,
  59. generator: genFalse,
  60. expression: genFalse,
  61. async: genFalse,
  62. params: gen.array(Identifier(), 0, 3),
  63. body: gen.oneOf([
  64. JSXElement(),
  65. BlockStatement()
  66. ])
  67. });
  68. }
  69.  
  70. function BlockStatement() {
  71. return gen.object({
  72. type: gen.return('BlockStatement'),
  73. directives: gen.return([]),
  74. body: gen.array(ReturnStatement(), 0, 1)
  75. });
  76. }
  77.  
  78. function ReturnStatement() {
  79. return gen.object({
  80. type: gen.return('ReturnStatement'),
  81. argument: gen.oneOf([
  82. JSXElement()
  83. ])
  84. });
  85. }
  86.  
  87. function JSXIdentifier() {
  88. return gen.object({
  89. type: gen.return('JSXIdentifier'),
  90. name: genAlphaString
  91. });
  92. }
  93.  
  94. function JSXExpressionContainer() {
  95. return gen.object({
  96. type: gen.return('JSXExpressionContainer'),
  97. expression: gen.oneOf([
  98. BooleanLiteral(),
  99. StringLiteral(),
  100. ])
  101. });
  102. }
  103.  
  104. function JSXAttribute() {
  105. return gen.object({
  106. type: gen.return('JSXAttribute'),
  107. name: JSXIdentifier(),
  108. value: gen.oneOf([
  109. StringLiteral(),
  110. JSXExpressionContainer()
  111. ])
  112. });
  113. }
  114.  
  115. function JSXOpeningElement() {
  116. return gen.object({
  117. type: gen.return('JSXOpeningElement'),
  118. attributes: gen.array(JSXAttribute(), 0, 3),
  119. name: JSXIdentifier(),
  120. selfClosing: genTrue
  121. });
  122. }
  123.  
  124. function JSXElement() {
  125. return gen.object({
  126. type: gen.return('JSXElement'),
  127. openingElement: JSXOpeningElement(),
  128. closingElement: genFalse,
  129. children: gen.return([])
  130. });
  131. }
  132.  
  133. const File = (statements) => ({
  134. type: 'File',
  135. program: {
  136. type: 'Program',
  137. sourceType: 'module',
  138. body: statements,
  139. directives: []
  140. },
  141. comments: []
  142. });
  143.  
  144. const result = check(
  145. property(
  146. [gen.array(VariableDeclaration(), 3)],
  147. (x) => {
  148. const { code } = generate(File(x));
  149.  
  150. return true;
  151. }
  152. )
  153. );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement