Просмотр исходного кода

Merge pull request #2873 from Kilo-Org/beatlevic/test-cases-llm-cleanup

Cleanup LLM test cases
Mark IJbema 4 месяцев назад
Родитель
Сommit
1e754c0eef
64 измененных файлов с 504 добавлено и 212 удалено
  1. 15 0
      src/test-llm-autocompletion/approvals/class-patterns/class-method-override.approved.2.txt
  2. 0 21
      src/test-llm-autocompletion/approvals/comment-driven/algorithm-description.approved.1.txt
  3. 0 22
      src/test-llm-autocompletion/approvals/comment-driven/algorithm-description.approved.2.txt
  4. 0 22
      src/test-llm-autocompletion/approvals/comment-driven/algorithm-description.approved.3.txt
  5. 6 0
      src/test-llm-autocompletion/approvals/comment-driven/fixme-bug.approved.4.txt
  6. 0 22
      src/test-llm-autocompletion/approvals/comment-driven/fixme-memory-leak.approved.1.txt
  7. 0 10
      src/test-llm-autocompletion/approvals/comment-driven/fixme-memory-leak.approved.2.txt
  8. 0 11
      src/test-llm-autocompletion/approvals/comment-driven/fixme-memory-leak.rejected.1.txt
  9. 0 6
      src/test-llm-autocompletion/approvals/comment-driven/fixme-memory-leak.rejected.2.txt
  10. 0 8
      src/test-llm-autocompletion/approvals/comment-driven/fixme-race-condition.rejected.1.txt
  11. 0 5
      src/test-llm-autocompletion/approvals/comment-driven/fixme-race-condition.rejected.2.txt
  12. 0 7
      src/test-llm-autocompletion/approvals/comment-driven/fixme-race-condition.rejected.3.txt
  13. 0 4
      src/test-llm-autocompletion/approvals/comment-driven/implement-function.approved.1.txt
  14. 0 7
      src/test-llm-autocompletion/approvals/comment-driven/implement-function.approved.2.txt
  15. 0 4
      src/test-llm-autocompletion/approvals/comment-driven/implement-function.approved.3.txt
  16. 0 7
      src/test-llm-autocompletion/approvals/comment-driven/implement-function.rejected.1.txt
  17. 14 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-caching.approved.4.txt
  18. 14 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-caching.approved.5.txt
  19. 8 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-debounce.approved.5.txt
  20. 14 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-error-handling.approved.6.txt
  21. 12 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-error-handling.approved.7.txt
  22. 11 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-logging.approved.5.txt
  23. 17 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-logging.approved.6.txt
  24. 5 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-logging.rejected.1.txt
  25. 0 4
      src/test-llm-autocompletion/approvals/comment-driven/todo-optimize.approved.1.txt
  26. 0 7
      src/test-llm-autocompletion/approvals/comment-driven/todo-optimize.rejected.1.txt
  27. 0 7
      src/test-llm-autocompletion/approvals/comment-driven/todo-optimize.rejected.2.txt
  28. 0 5
      src/test-llm-autocompletion/approvals/comment-driven/todo-optimize.rejected.3.txt
  29. 0 5
      src/test-llm-autocompletion/approvals/comment-driven/todo-optimize.rejected.4.txt
  30. 7 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-pagination.approved.3.txt
  31. 4 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-pagination.approved.4.txt
  32. 12 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-rate-limiting.approved.5.txt
  33. 17 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-rate-limiting.approved.6.txt
  34. 28 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-rate-limiting.approved.7.txt
  35. 21 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-retry-logic.approved.4.txt
  36. 19 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-retry-logic.approved.5.txt
  37. 21 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-retry-logic.approved.6.txt
  38. 7 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-sanitize-input.approved.4.txt
  39. 13 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-validation.approved.3.txt
  40. 13 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-validation.approved.4.txt
  41. 13 0
      src/test-llm-autocompletion/approvals/comment-driven/todo-validation.approved.5.txt
  42. 7 0
      src/test-llm-autocompletion/approvals/complex/object-with-inline-comments.rejected.4.txt
  43. 4 0
      src/test-llm-autocompletion/approvals/control-flow/return-statement.rb.approved.2.txt
  44. 5 0
      src/test-llm-autocompletion/approvals/error-handling/async-error-handling.approved.7.txt
  45. 7 0
      src/test-llm-autocompletion/approvals/error-handling/promise-rejection.approved.6.txt
  46. 7 0
      src/test-llm-autocompletion/approvals/error-handling/rescue-handling.rb.approved.5.txt
  47. 5 0
      src/test-llm-autocompletion/approvals/error-handling/rescue-handling.rb.approved.6.txt
  48. 2 0
      src/test-llm-autocompletion/approvals/function-call/function-call-args.approved.6.txt
  49. 1 0
      src/test-llm-autocompletion/approvals/import-statement/import-curly-brace.approved.3.txt
  50. 4 0
      src/test-llm-autocompletion/approvals/inline-completion/function-parameter.rejected.3.txt
  51. 1 0
      src/test-llm-autocompletion/approvals/inline-completion/method-call-completion.rejected.1.txt
  52. 2 0
      src/test-llm-autocompletion/approvals/inline-completion/variable-assignment-value.approved.4.txt
  53. 137 0
      src/test-llm-autocompletion/approvals/larger-examples/gilded-rose.ts.approved.3.txt
  54. 8 0
      src/test-llm-autocompletion/approvals/new-line/after-opening-brace.approved.5.txt
  55. 5 0
      src/test-llm-autocompletion/approvals/new-line/after-opening-brace.approved.6.txt
  56. 5 0
      src/test-llm-autocompletion/approvals/new-line/after-variable-declaration.approved.4.txt
  57. 5 0
      src/test-llm-autocompletion/approvals/new-line/after-variable-declaration.rejected.2.txt
  58. 5 0
      src/test-llm-autocompletion/approvals/new-line/before-closing-brace.approved.3.txt
  59. 3 0
      src/test-llm-autocompletion/approvals/variable-assignment/object-declaration.rb.approved.4.txt
  60. 0 5
      src/test-llm-autocompletion/test-cases/comment-driven/algorithm-description.txt
  61. 0 7
      src/test-llm-autocompletion/test-cases/comment-driven/fixme-memory-leak.txt
  62. 0 6
      src/test-llm-autocompletion/test-cases/comment-driven/fixme-race-condition.txt
  63. 0 5
      src/test-llm-autocompletion/test-cases/comment-driven/implement-function.txt
  64. 0 5
      src/test-llm-autocompletion/test-cases/comment-driven/todo-optimize.txt

+ 15 - 0
src/test-llm-autocompletion/approvals/class-patterns/class-method-override.approved.2.txt

@@ -0,0 +1,15 @@
+class Shape {
+	area() {
+		return this.width * this.height;0;
+	}
+}
+
+class Rectangle extends Shape {
+	constructor(width, height) {
+		super();
+		this.width = width;
+		this.height = height;
+	}
+	
+	area() {
+		return <<<AUTOCOMPLETE_HERE>>>

+ 0 - 21
src/test-llm-autocompletion/approvals/comment-driven/algorithm-description.approved.1.txt

@@ -1,21 +0,0 @@
-function quickSort(arr) {
-  // Implement quicksort: pick pivot, partition array, recursively sort partitions
-  if (arr.length <= 1) {
-    return arr;
-  }
-
-  const pivot = arr[0];
-  const left = [];
-  const right = [];
-
-  for (let i = 1; i < arr.length; i++) {
-    if (arr[i] < pivot) {
-      left.push(arr[i]);
-    } else {
-      right.push(arr[i]);
-    }
-  }
-
-  return [...quickSort(left), pivot, ...quickSort(right)];
-  return arr;
-}

+ 0 - 22
src/test-llm-autocompletion/approvals/comment-driven/algorithm-description.approved.2.txt

@@ -1,22 +0,0 @@
-function quickSort(arr: number[]): number[] {
-  if (arr.length <= 1) {
-    return arr;
-  }
-
-  const pivot = arr[Math.floor(arr.length / 2)];
-  const left = [];
-  const right = [];
-  const equal = [];
-
-  for (const element of arr) {
-    if (element < pivot) {
-      left.push(element);
-    } else if (element > pivot) {
-      right.push(element);
-    } else {
-      equal.push(element);
-    }
-  }
-
-  return [...quickSort(left), ...equal, ...quickSort(right)];
-}

+ 0 - 22
src/test-llm-autocompletion/approvals/comment-driven/algorithm-description.approved.3.txt

@@ -1,22 +0,0 @@
-function quickSort(arr) {
-  // Implement quicksort: pick pivot, partition array, recursively sort partitions
-  if (arr.length <= 1) {
-    return arr;
-  }
-
-  const pivot = arr[Math.floor(arr.length / 2)];
-  const left = [];
-  const right = [];
-
-  for (let i = 0; i < arr.length; i++) {
-    if (i === Math.floor(arr.length / 2)) continue;
-    if (arr[i] < pivot) {
-      left.push(arr[i]);
-    } else {
-      right.push(arr[i]);
-    }
-  }
-
-  return [...quickSort(left), pivot, ...quickSort(right)];
-  return arr;
-}

+ 6 - 0
src/test-llm-autocompletion/approvals/comment-driven/fixme-bug.approved.4.txt

@@ -0,0 +1,6 @@
+function divide(a: number, b: number): number {
+  if (b === 0) {
+    throw new Error('Division by zero is not allowed');
+  }
+  return a / b;
+}

+ 0 - 22
src/test-llm-autocompletion/approvals/comment-driven/fixme-memory-leak.approved.1.txt

@@ -1,22 +0,0 @@
-class EventEmitter {
-  // FIXME: Memory leak - listeners not being cleaned up
-  private listeners: Array<{ event: string; callback: Function }> = [];
-
-  on(event: string, callback: Function): void {
-    this.listeners.push({ event, callback });
-  }
-
-  off(event: string, callback: Function): void {
-    this.listeners = this.listeners.filter(
-      listener => !(listener.event === event && listener.callback === callback)
-    );
-  }
-
-  removeAllListeners(event?: string): void {
-    if (event) {
-      this.listeners = this.listeners.filter(listener => listener.event !== event);
-    } else {
-      this.listeners = [];
-    }
-  }
-}

+ 0 - 10
src/test-llm-autocompletion/approvals/comment-driven/fixme-memory-leak.approved.2.txt

@@ -1,10 +0,0 @@
-class EventEmitter {
-  constructor() {
-    this.listeners = [];
-  }
-
-  // FIXME: Memory leak - listeners not being cleaned up<<<AUTOCOMPLETE_HERE>>>
-  on(event, callback) {
-    this.listeners.push({ event, callback });
-  }
-}

+ 0 - 11
src/test-llm-autocompletion/approvals/comment-driven/fixme-memory-leak.rejected.1.txt

@@ -1,11 +0,0 @@
-class EventEmitter {
-  // FIXME: Memory leak - listeners not being cleaned up
-  private listeners = [];
-
-  constructor() {
-    this.listeners = [];
-  }
-  on(event, callback) {
-    this.listeners.push({ event, callback });
-  }
-}

+ 0 - 6
src/test-llm-autocompletion/approvals/comment-driven/fixme-memory-leak.rejected.2.txt

@@ -1,6 +0,0 @@
-class EventEmitter {
-  // FIXME: Memory leak - listeners not being cleaned up<<<AUTOCOMPLETE_HERE>>>
-  on(event, callback) {
-    this.listeners.push({ event, callback });
-  }
-}

+ 0 - 8
src/test-llm-autocompletion/approvals/comment-driven/fixme-race-condition.rejected.1.txt

@@ -1,8 +0,0 @@
-async function updateCounter() {
-  // FIXME: Race condition when multiple updates happen simultaneously
-  const lock = await acquireLock('counter');
-  try {
-
-  const current = await getCounter();
-  await setCounter(current + 1);
-}

+ 0 - 5
src/test-llm-autocompletion/approvals/comment-driven/fixme-race-condition.rejected.2.txt

@@ -1,5 +0,0 @@
-async function updateCounter() {
-  // FIXME: Race condition when multiple updates happen simultaneously
-  const current = await getCounter();
-  await setCounter(current + 1);
-}

+ 0 - 7
src/test-llm-autocompletion/approvals/comment-driven/fixme-race-condition.rejected.3.txt

@@ -1,7 +0,0 @@
-async function updateCounter() {
-  // FIXME: Race condition when multiple updates happen simultaneously
-  const current = await getCounter();
-  await setCounter(current + 1);
-  const current = await getCounter();
-  await setCounter(current + 1);
-}

+ 0 - 4
src/test-llm-autocompletion/approvals/comment-driven/implement-function.approved.1.txt

@@ -1,4 +0,0 @@
-// Calculate factorial of a number recursively
-function factorial(n) {
-  return n === 0 ? 1 : n * factorial(n - 1);
-}

+ 0 - 7
src/test-llm-autocompletion/approvals/comment-driven/implement-function.approved.2.txt

@@ -1,7 +0,0 @@
-// Calculate factorial of a number recursively
-function factorial(n: number): number {
-  if (n < 0) {
-    throw new Error('Factorial is not defined for negative numbers');
-  }
-  return n === 0 ? 1 : n * factorial(n - 1);
-}

+ 0 - 4
src/test-llm-autocompletion/approvals/comment-driven/implement-function.approved.3.txt

@@ -1,4 +0,0 @@
-// Calculate factorial of a number recursively<<<AUTOCOMPLETE_HERE>>>
-function factorial(n) {
-  return n === 0 ? 1 : n * factorial(n - 1);
-}

+ 0 - 7
src/test-llm-autocompletion/approvals/comment-driven/implement-function.rejected.1.txt

@@ -1,7 +0,0 @@
-// Calculate factorial of a number recursively
-function factorial(n) {
-  return n === 0 ? 1 : n * factorial(n - 1);
-}
-function factorial(n) {
-  return n === 0 ? 1 : n * factorial(n - 1);
-}

+ 14 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-caching.approved.4.txt

@@ -0,0 +1,14 @@
+class DataService {
+  private cache = new Map();
+
+  // TODO: Implement caching mechanism to reduce API calls
+  async fetchData(id) {
+    if (this.cache.has(id)) {
+      return this.cache.get(id);
+    }
+
+    const data = await api.get(`/data/${id}`);
+    this.cache.set(id, data);
+    return data;
+  }
+}

+ 14 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-caching.approved.5.txt

@@ -0,0 +1,14 @@
+class DataService {
+  private cache: Map<string, any> = new Map();
+
+  // TODO: Implement caching mechanism to reduce API calls
+  async fetchData(id) {
+    if (this.cache.has(id)) {
+      return this.cache.get(id);
+    }
+
+    const data = await api.get(`/data/${id}`);
+    this.cache.set(id, data);
+    return data;
+  }
+}

+ 8 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-debounce.approved.5.txt

@@ -0,0 +1,8 @@
+function handleSearch(query) {
+  // TODO: Add debounce to prevent excessive API calls
+  const debouncedSearch = debounce((query) => {
+    searchAPI(query);
+  }, 500);
+
+  debouncedSearch(query);
+}

+ 14 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-error-handling.approved.6.txt

@@ -0,0 +1,14 @@
+function processData(data) {
+  if (!data) {
+    throw new Error('Data is required');
+  }
+
+  try {
+    // Process the data here
+    const processedData = data; // Replace with actual processing logic
+    return processedData;
+  } catch (error) {
+    console.error('Error processing data:', error);
+    throw error; // Re-throw the error for the caller to handle
+  }
+}

+ 12 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-error-handling.approved.7.txt

@@ -0,0 +1,12 @@
+function processData(data) {
+  if (!data) {
+    throw new Error('Data is required');
+  }
+
+  if (typeof data !== 'object') {
+    throw new Error('Data must be an object');
+  }
+
+  // TODO: Implement error handling
+  return processedData;
+}

+ 11 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-logging.approved.5.txt

@@ -0,0 +1,11 @@
+function processOrder(order) {
+  console.log(`Processing order: ${JSON.stringify(order)}`);
+  try {
+    const result = validateOrder(order);
+    console.log(`Order processed successfully: ${JSON.stringify(result)}`);
+    return result;
+  } catch (error) {
+    console.error(`Error processing order: ${error.message}`);
+    throw error;
+  }
+}

+ 17 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-logging.approved.6.txt

@@ -0,0 +1,17 @@
+function processOrder(order) {
+  console.log(`Processing order: ${JSON.stringify(order)}`);
+  const startTime = Date.now();
+
+  try {
+    const result = validateOrder(order);
+    const endTime = Date.now();
+    console.log(`Order processed successfully in ${endTime - startTime}ms`);
+    console.log(`Processing result: ${JSON.stringify(result)}`);
+    return result;
+  } catch (error) {
+    const endTime = Date.now();
+    console.error(`Order processing failed after ${endTime - startTime}ms`);
+    console.error(`Error details: ${error.message}`);
+    throw error;
+  }
+}

+ 5 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-logging.rejected.1.txt

@@ -0,0 +1,5 @@
+function processOrder(order) {
+  // TODO: Add comprehensive logging for order processing<<<AUTOCOMPLETE_HERE>>>
+  const result = validateOrder(order);
+  return result;
+}

+ 0 - 4
src/test-llm-autocompletion/approvals/comment-driven/todo-optimize.approved.1.txt

@@ -1,4 +0,0 @@
-for (let i = 0; i < input; i++) {
-  // Optimized by using multiplication instead of Math.pow
-  result += i * i;
-}

+ 0 - 7
src/test-llm-autocompletion/approvals/comment-driven/todo-optimize.rejected.1.txt

@@ -1,7 +0,0 @@
-for (let i = 0; i < input; i++) {
-  // TODO: Optimize this function for performance
-  // Optimize performance by precomputing values
-  const squared = i * i;
-  result += squared;
-  result += Math.pow(i, 2);
-}

+ 0 - 7
src/test-llm-autocompletion/approvals/comment-driven/todo-optimize.rejected.2.txt

@@ -1,7 +0,0 @@
-for (let i = 0; i < input; i++) {
-  // TODO: Optimize this function for performance
-  // Optimize this function for performance
-  // Consider using memoization or caching for repeated calculations
-  // Or precompute values if possible
-  result += Math.pow(i, 2);
-}

+ 0 - 5
src/test-llm-autocompletion/approvals/comment-driven/todo-optimize.rejected.3.txt

@@ -1,5 +0,0 @@
-for (let i = 0; i < input; i++) {
-  // Calculate the square of the current number and add it to the result
-  result += Math.pow(i, 2);
-  result += Math.pow(i, 2);
-}

+ 0 - 5
src/test-llm-autocompletion/approvals/comment-driven/todo-optimize.rejected.4.txt

@@ -1,5 +0,0 @@
-for (let i = 0; i < input; i++) {
-  // Calculate the square of the current index and add it to the result
-  result += Math.pow(i, 2);
-  result += Math.pow(i, 2);
-}

+ 7 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-pagination.approved.3.txt

@@ -0,0 +1,7 @@
+function fetchUsers(page: number, limit: number) {
+  // Calculate offset based on page and limit
+  const offset = (page - 1) * limit;
+
+  // Implement pagination with offset and limit
+  return db.query('SELECT * FROM users LIMIT ? OFFSET ?', [limit, offset]);
+}

+ 4 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-pagination.approved.4.txt

@@ -0,0 +1,4 @@
+function fetchUsers(page, limit) {
+  const offset = (page - 1) * limit;
+  return db.query('SELECT * FROM users LIMIT ? OFFSET ?', [limit, offset]);
+}

+ 12 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-rate-limiting.approved.5.txt

@@ -0,0 +1,12 @@
+function handleAPIRequest(req, res) {
+  // Implement rate limiting to prevent abuse
+  const rateLimit = require('express-rate-limit');
+  const limiter = rateLimit({
+    windowMs: 15 * 60 * 1000, // 15 minutes
+    max: 100 // limit each IP to 100 requests per windowMs
+  });
+  limiter(req, res, () => {
+    processRequest(req, res);
+  });<<<AUTOCOMPLETE_HERE>>>
+  processRequest(req, res);
+}

+ 17 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-rate-limiting.approved.6.txt

@@ -0,0 +1,17 @@
+function handleAPIRequest(req, res) {
+  // Implement rate limiting to prevent abuse
+  const rateLimit = require('express-rate-limit');
+
+  const limiter = rateLimit({
+    windowMs: 15 * 60 * 1000, // 15 minutes
+    max: 100 // limit each IP to 100 requests per windowMs
+  });
+
+  // Apply the rate limiting middleware to all requests
+  limiter(req, res, (err) => {
+    if (err) {
+      return res.status(429).json({ error: 'Too many requests, please try again later' });
+    }
+    processRequest(req, res);
+  });
+}

+ 28 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-rate-limiting.approved.7.txt

@@ -0,0 +1,28 @@
+function handleAPIRequest(req, res) {
+  // Implement rate limiting to prevent abuse
+  const rateLimit = 100; // requests per minute
+  const windowMs = 60 * 1000; // 1 minute in milliseconds
+  const now = Date.now();
+  const windowStart = now - windowMs;
+
+  // Initialize request count if it doesn't exist
+  if (!req.app.locals.requestCounts) {
+    req.app.locals.requestCounts = [];
+  }
+
+  // Remove old requests from the window
+  req.app.locals.requestCounts = req.app.locals.requestCounts.filter(
+    timestamp => timestamp > windowStart
+  );
+
+  // Check if the request limit has been exceeded
+  if (req.app.locals.requestCounts.length >= rateLimit) {
+    res.status(429).send('Too many requests, please try again later.');
+    return;
+  }
+
+  // Add the current request to the count
+  req.app.locals.requestCounts.push(now);
+
+  processRequest(req, res);
+}

+ 21 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-retry-logic.approved.4.txt

@@ -0,0 +1,21 @@
+async function fetchWithRetry(url) {
+  const maxRetries = 3;
+  const baseDelay = 1000; // 1 second
+
+  for (let attempt = 0; attempt < maxRetries; attempt++) {
+    try {
+      const response = await fetch(url);
+      if (!response.ok) {
+        throw new Error(`HTTP error! status: ${response.status}`);
+      }
+      return response.json();
+    } catch (error) {
+      if (attempt === maxRetries - 1) throw error;
+
+      const delay = baseDelay * Math.pow(2, attempt);
+      await new Promise(resolve => setTimeout(resolve, delay));
+    }
+  }<<<AUTOCOMPLETE_HERE>>>
+  const response = await fetch(url);
+  return response.json();
+}

+ 19 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-retry-logic.approved.5.txt

@@ -0,0 +1,19 @@
+async function fetchWithRetry(url) {
+  const maxRetries = 3;
+  const baseDelay = 1000; // 1 second
+
+  for (let attempt = 0; attempt < maxRetries; attempt++) {
+    try {
+      const response = await fetch(url);
+      if (!response.ok) {
+        throw new Error(`HTTP error! status: ${response.status}`);
+      }
+      return response.json();
+    } catch (error) {
+      if (attempt === maxRetries - 1) throw error;
+
+      const delay = baseDelay * Math.pow(2, attempt);
+      await new Promise(resolve => setTimeout(resolve, delay));
+    }
+  }
+}

+ 21 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-retry-logic.approved.6.txt

@@ -0,0 +1,21 @@
+async function fetchWithRetry(url) {
+    const maxRetries = 3;
+  const baseDelay = 1000; // 1 second
+
+  for (let attempt = 1; attempt <= maxRetries; attempt++) {
+    try {
+      const response = await fetch(url);
+      if (!response.ok) {
+        throw new Error(`HTTP error! status: ${response.status}`);
+      }
+      return response.json();
+    } catch (error) {
+      if (attempt === maxRetries) {
+        throw error;
+      }
+      const delay = baseDelay * Math.pow(2, attempt - 1);
+      await new Promise(resolve => setTimeout(resolve, delay));
+    }
+  }
+  return response.json();
+}

+ 7 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-sanitize-input.approved.4.txt

@@ -0,0 +1,7 @@
+function renderUserComment(comment) {
+  // Sanitize input to prevent XSS attacks
+  const sanitizedComment = comment.replace(/</g, '&lt;').replace(/>/g, '&gt;');
+  document.getElementById('comments').innerHTML = sanitizedComment;
+}
+  document.getElementById('comments').innerHTML = comment;
+}

+ 13 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-validation.approved.3.txt

@@ -0,0 +1,13 @@
+function registerUser(email, password) {
+  // TODO: Add input validation for email and password
+  if (!email || !password) {
+    throw new Error('Email and password are required');
+  }
+  if (!email.includes('@')) {
+    throw new Error('Invalid email format');
+  }
+  if (password.length < 8) {
+    throw new Error('Password must be at least 8 characters long');
+  }<<<AUTOCOMPLETE_HERE>>>
+  return createUser(email, password);
+}

+ 13 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-validation.approved.4.txt

@@ -0,0 +1,13 @@
+function registerUser(email: string, password: string) {
+  // Validate email format
+  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
+    throw new Error('Invalid email format');
+  }
+
+  // Validate password length
+  if (password.length < 8) {
+    throw new Error('Password must be at least 8 characters long');
+  }
+
+  return createUser(email, password);
+}

+ 13 - 0
src/test-llm-autocompletion/approvals/comment-driven/todo-validation.approved.5.txt

@@ -0,0 +1,13 @@
+function registerUser(email: string, password: string) {
+  // Validate email
+  if (!email || typeof email !== 'string' || !email.includes('@')) {
+    throw new Error('Invalid email address');
+  }
+
+  // Validate password
+  if (!password || typeof password !== 'string' || password.length < 8) {
+    throw new Error('Password must be at least 8 characters long');
+  }
+
+  return createUser(email, password);
+}

+ 7 - 0
src/test-llm-autocompletion/approvals/complex/object-with-inline-comments.rejected.4.txt

@@ -0,0 +1,7 @@
+const creditConfig = {
+	credit_category: 'credits',
+	description: 'Free credits as a reward',
+	amount_usd: 5, // inlined from FREE CREDITS<<<AUTOCOMPLETE_HERE>>>, // inlined from FREE CREDITS
+	is_idempotent: true,
+	expiry: "2 months",
+	

+ 4 - 0
src/test-llm-autocompletion/approvals/control-flow/return-statement.rb.approved.2.txt

@@ -0,0 +1,4 @@
+def calculate_total(items)
+	sum = 0
+	items.each { |item| sum += item }
+	return sum<<<AUTOCOMPLETE_HERE>>>

+ 5 - 0
src/test-llm-autocompletion/approvals/error-handling/async-error-handling.approved.7.txt

@@ -0,0 +1,5 @@
+async function saveUser(userData) {
+	try {
+		const validated = await validateUser(userData);
+		const saved = await saveToDatabase(validated);
+		<<<AUTOCOMPLETE_HERE>>>

+ 7 - 0
src/test-llm-autocompletion/approvals/error-handling/promise-rejection.approved.6.txt

@@ -0,0 +1,7 @@
+fetchUser(userId)
+	.then(user => {
+		return processUser(user);
+	})
+	.catch(error => {
+		console.error('Error:', error);
+	})

+ 7 - 0
src/test-llm-autocompletion/approvals/error-handling/rescue-handling.rb.approved.5.txt

@@ -0,0 +1,7 @@
+def process_data(data)
+	begin
+		result = JSON.parse(data)
+		rescue JSON::ParserError => e
+			puts "Error parsing JSON: #{e.message}"
+			return nil
+		end

+ 5 - 0
src/test-llm-autocompletion/approvals/error-handling/rescue-handling.rb.approved.6.txt

@@ -0,0 +1,5 @@
+def process_data(data)
+	begin
+		result = JSON.parse(data)
+		result
+		<<<AUTOCOMPLETE_HERE>>>

+ 2 - 0
src/test-llm-autocompletion/approvals/function-call/function-call-args.approved.6.txt

@@ -0,0 +1,2 @@
+function greet(name) { return 'Hello ' + name; }
+greet('World')

+ 1 - 0
src/test-llm-autocompletion/approvals/import-statement/import-curly-brace.approved.3.txt

@@ -0,0 +1 @@
+import React <<<AUTOCOMPLETE_HERE>>> from 'react'

+ 4 - 0
src/test-llm-autocompletion/approvals/inline-completion/function-parameter.rejected.3.txt

@@ -0,0 +1,4 @@
+function greet(name) {
+  console.log(`Hello ${name}!`); {
+  console.log(`Hello ${name}!`);
+}

+ 1 - 0
src/test-llm-autocompletion/approvals/inline-completion/method-call-completion.rejected.1.txt

@@ -0,0 +1 @@
+const result = items.map(x => x * 2);map(x => x * 2);

+ 2 - 0
src/test-llm-autocompletion/approvals/inline-completion/variable-assignment-value.approved.4.txt

@@ -0,0 +1,2 @@
+const total = items.reduce((sum, item) => sum + item, 0);;
+const items = [1, 2, 3, 4, 5];

+ 137 - 0
src/test-llm-autocompletion/approvals/larger-examples/gilded-rose.ts.approved.3.txt

@@ -0,0 +1,137 @@
+
+/* README
+
+# Gilded Rose
+
+This is the Gilded Rose kata in TypeScript.
+
+## Getting started
+
+Install dependencies
+
+```sh
+npm install
+```
+
+## Run the unit tests from the Command-Line
+
+There are two unit test frameworks to choose from, Jest and Mocha.
+
+```sh
+npm run test:jest
+```
+
+To run all tests in watch mode
+
+```sh
+npm run test:jest:watch
+```
+
+Mocha
+
+```sh
+npm run test:mocha
+```
+
+
+## Run the TextTest fixture from the Command-Line
+
+_You may need to install `ts-node`_
+
+```sh
+npx ts-node test/golden-master-text-test.ts
+```
+
+Or with number of days as args:
+```sh
+npx ts-node test/golden-master-text-test.ts 10
+```
+
+You should make sure the command shown above works when you execute it in a terminal before trying to use TextTest (see below).
+
+
+## Run the TextTest approval test that comes with this project
+
+There are instructions in the [TextTest Readme](../texttests/README.md) for setting up TextTest. You will need to specify the Python executable and interpreter in [config.gr](../texttests/config.gr). Uncomment these lines:
+
+    executable:${TEXTTEST_HOME}/python/texttest_fixture.py
+    interpreter:python
+
+
+*/
+
+export class Item {
+	name: string
+	sellIn: number
+	quality: number
+
+	constructor(name, sellIn, quality) {
+		this.name = name
+		this.sellIn = sellIn
+		this.quality = quality
+	}
+}
+
+export class GildedRose {
+	items: Array<Item>
+
+	constructor(items = [] as Array<Item>) {
+		this.items = items
+	}
+
+	updateQuality() {
+		for (let i = 0; i < this.items.length; i++) {
+			if (
+				this.items[i].name != "Aged Brie" &&
+				this.items[i].name != "Backstage passes to a TAFKAL80ETC concert"
+			) {
+				if (this.items[i].quality > 0) {
+					if (this.items[i].name != "Sulfuras, Hand of Ragnaros") {
+						this.items[i].quality = this.items[i].quality - 1
+					}
+				}
+			} else {
+				if (this.items[i].quality < 50) {
+					this.items[i].quality = this.items[i].quality + 1
+					if (this.items[i].name == "Backstage passes to a TAFKAL80ETC concert") {
+						if (this.items[i].sellIn < 11) {
+							if (this.items[i].quality < 50) {
+								this.items[i].quality = this.items[i].quality + 1
+							}
+						}
+						if (this.items[i].sellIn < 6) {
+							if (this.items[i].quality < 50) {
+								this.items[i].quality = this.items[i].quality + 1
+							}
+						}
+					}
+				}
+			}
+			if (this.items[i].name != "Sulfuras, Hand of Ragnaros") {
+				this.items[i].sellIn = this.items[i].sellIn - 1
+			}
+			if (this.items[i].sellIn < 0) {
+				if (this.items[i].name != "Aged Brie") {
+					if (this.items[i].name != "Backstage passes to a TAFKAL80ETC concert") {
+						if (this.items[i].quality > 0) {
+							if (this.items[i].name != "Sulfuras, Hand of Ragnaros") {
+								this.items[i].quality = this.items[i].quality - 1
+							}
+						}
+					} else {
+						this.items[i].quality = this.items[i].quality - this.items[i].quality
+					}
+				} else {
+					if (this.items[i].quality < 50) {
+								this.items[i].quality = this.items[i].quality + 1
+							}
+						}) {
+						this.items[i].quality = this.items[i].quality + 1
+					}
+				}
+			}
+		}
+
+		return this.items
+	}
+}

+ 8 - 0
src/test-llm-autocompletion/approvals/new-line/after-opening-brace.approved.5.txt

@@ -0,0 +1,8 @@
+function processItems(items) {
+    const processedItems = [];
+    for (const item of items) {
+        processedItems.push(processItem(item));
+    }
+    return processedItems;
+}
+}

+ 5 - 0
src/test-llm-autocompletion/approvals/new-line/after-opening-brace.approved.6.txt

@@ -0,0 +1,5 @@
+function processItems(items) {
+    for (const item of items) {
+        // Process each item
+    }
+}

+ 5 - 0
src/test-llm-autocompletion/approvals/new-line/after-variable-declaration.approved.4.txt

@@ -0,0 +1,5 @@
+function initialize() {
+  const config = loadConfig();
+  console.log(config);
+  return config;
+}

+ 5 - 0
src/test-llm-autocompletion/approvals/new-line/after-variable-declaration.rejected.2.txt

@@ -0,0 +1,5 @@
+function initialize() {
+  const config = loadConfig();
+  const processedConfig = processConfig(config);
+  return config;
+}

+ 5 - 0
src/test-llm-autocompletion/approvals/new-line/before-closing-brace.approved.3.txt

@@ -0,0 +1,5 @@
+function calculateTotal(items) {
+  const sum = items.reduce((a, b) => a + b, 0);
+  return sum;
+}
+}

+ 3 - 0
src/test-llm-autocompletion/approvals/variable-assignment/object-declaration.rb.approved.4.txt

@@ -0,0 +1,3 @@
+user = {
+	name: 'John',
+	email: '[email protected]',

+ 0 - 5
src/test-llm-autocompletion/test-cases/comment-driven/algorithm-description.txt

@@ -1,5 +0,0 @@
-# Description: Should implement algorithm described in comment
-function quickSort(arr) {
-  // Implement quicksort: pick pivot, partition array, recursively sort partitions<<<CURSOR>>>
-  return arr;
-}

+ 0 - 7
src/test-llm-autocompletion/test-cases/comment-driven/fixme-memory-leak.txt

@@ -1,7 +0,0 @@
-# Description: Should fix memory leak described in FIXME
-class EventEmitter {
-  // FIXME: Memory leak - listeners not being cleaned up<<<CURSOR>>>
-  on(event, callback) {
-    this.listeners.push({ event, callback });
-  }
-}

+ 0 - 6
src/test-llm-autocompletion/test-cases/comment-driven/fixme-race-condition.txt

@@ -1,6 +0,0 @@
-# Description: Should fix race condition in async code
-async function updateCounter() {
-  // FIXME: Race condition when multiple updates happen simultaneously<<<CURSOR>>>
-  const current = await getCounter();
-  await setCounter(current + 1);
-}

+ 0 - 5
src/test-llm-autocompletion/test-cases/comment-driven/implement-function.txt

@@ -1,5 +0,0 @@
-# Description: Should implement function body after comment
-// Calculate factorial of a number recursively<<<CURSOR>>>
-function factorial(n) {
-  return n === 0 ? 1 : n * factorial(n - 1);
-}

+ 0 - 5
src/test-llm-autocompletion/test-cases/comment-driven/todo-optimize.txt

@@ -1,5 +0,0 @@
-# Description: Should implement optimization after TODO comment
-for (let i = 0; i < input; i++) {
-  // TODO: Optimize this function for performance<<<CURSOR>>>
-  result += Math.pow(i, 2);
-}