<commit_before>test('parser picks up root level attributes', function() {
  var node = $('

').get(0);

  ko.applyBindings({firstName: ''}, node);

  ok(node.getAttribute('data-bind'));
});

test('parser picks up nested nodes', function() {
  var node = $('

').get(0);

  ko.applyBindings({firstName: ''}, node);

  ok(!node.getAttribute('data-bind'));
  ok(node.childNodes[0].getAttribute('data-bind'));
});

test('parsed bindings work in knockout', function() {
  var node = $('

').get(0);

  ko.applyBindings({ firstName: 'Aaron' }, node);

  ok(node.innerHTML === 'Aaron');
});

test('binding properties based on convention', function() {
  var node = $('

').get(0);

  ko.applyBindings({ text: 'Aaron' }, node);

  ok(node.innerHTML === 'Aaron');
});

test('bindings can be provided from a schema', function() {
  var node = $('

').get(0);

  ko.applyBindings({text: ''}, { text: 'text' }, node);

  ok(node.getAttribute('data-bind'));
});

test('schema bindings get applied by knockout', function() {
  var node = $('

').get(0);

  ko.applyBindings({firstName: 'Aaron'}, { text: 'firstName' }, node);

  ok(node.innerHTML === 'Aaron');
})<commit_msg>missing semicolon<commit_after>test('parser picks up root level attributes', function() {
  var node = $('

').get(0);

  ko.applyBindings({firstName: ''}, node);

  ok(node.getAttribute('data-bind'));
});

test('parser picks up nested nodes', function() {
  var node = $('

').get(0);

  ko.applyBindings({firstName: ''}, node);

  ok(!node.getAttribute('data-bind'));
  ok(node.childNodes[0].getAttribute('data-bind'));
});

test('parsed bindings work in knockout', function() {
  var node = $('

').get(0);

  ko.applyBindings({ firstName: 'Aaron' }, node);

  ok(node.innerHTML === 'Aaron');
});

test('binding properties based on convention', function() {
  var node = $('

').get(0);

  ko.applyBindings({ text: 'Aaron' }, node);

  ok(node.innerHTML === 'Aaron');
});

test('bindings can be provided from a schema', function() {
  var node = $('

').get(0);

  ko.applyBindings({text: ''}, { text: 'text' }, node);

  ok(node.getAttribute('data-bind'));
});

test('schema bindings get applied by knockout', function() {
  var node = $('

').get(0);

  ko.applyBindings({firstName: 'Aaron'}, { text: 'firstName' }, node);

  ok(node.innerHTML === 'Aaron');
});<|endoftext|>


<commit_before>// А ты как себе это представлял?

var variants = {
  what: [ 'API для чистки зубов',
          'Пивной ларек',
          'Wysiwyg редактор',
          'Офисный пакет',
          'Скриншотер',
          'Клон Dota',
          'Шутер',
          'Виртуальная машина',
          'Стратегия',
          'RPG',
          'Песочница',
          'Приложение вконтакте',
          'Приложение facebook',
          'Эмулятор Windows',
          'IDE',
          'Skype',
          'Анонимный чат',
          'Блогохостинг',
          'Видео-хостинг',
          'Видео-чат',
          'Генератор идей',
          'Движок для форумов',
          'Доска объявлений',
          'Коллективный блог',
          'Музыкальный сервис',
          'Новостной портал',
          'Облачный хостинг',
          'Онлайн-библиотека',
          'Операционная система',
          'Поисковая система',
          'Почтовый сервис',
          'Процессинг карт',
          'Сервис микроблоггинга',
          'Торрент-трекер',
          'Файлообменник',
          'Фотохостинг',
          'Хостинг',
          'Чат',
          'CMS',
          'Дистрибутив линукса',
          'Социальная сеть',
          'Цитатник',
          'Веб-браузер',
          'Каталог jQuery-плагинов',
          'Вики',
          'Сервис координации флешмобов',
          'MMORPG',
          'Фоторедактор',
          'Онлайн-рисовалка',
          'Хостинг исходников',
          'Сайт о путешествиях',
          'Кулинарный сайт',
          'Погода',
          'Будильник',
          'RSS-ридер',
          'Калькулятор',
          'Сайт знакомств для животных',
          'Онлайн-университет',
          'Блокировщик рекламы',
          'Сайт с видео-уроками по вышиванию',
          'Закрытое сообщество',
          'Сервис поиска собутыльников',
          'Система проверки на плагиат',
          'Сокращатель ссылок',
          'Сервис подбора музыки',
          'Сервис подбора платьев',
          'Сервис подбора причесок',
          'Сервис подбора хостинга',
          'Сервис подбора CMS',
          'Сервис подбора ресторанов',
          'Онлайн-аукцион',
          'Магазин футболок',
          'Магазин носков',
          'Сервис мгновенных сообщений',
          'Сервис голосовых сообщений',
          'Планировщик',
          'Календарь',
          'Навигатор',
          'Эмулятор старых консолей',
          'Судоку',
          'IQ-тест',
          'Сервис микроплатежей',
          'Аггрегатор новостей',
          'Сервис облачных бекапов',
          'CDN',
          'Сервис ВиО',
          'Табличный процессор',
          'Кнопки соцсетей',
          'Система комментариев на сайт',
          'Поиск для сайта',
          'Онлайн-кинотеатр',
          'Система статистики',
          'Хостинг портфолио',
          'Онлайн музыкальный редактор',
          'Музыкальный плеер',
          'Видео плеер',
          'Онлайн-радио',
          'Сайт знакомств',
          'Сервис сайтов-визиток',
          'Карты',
          'Защищенный мессенджер',
          'Анонимайзер',
          'Записная книга',
          'Сервис быстрых заметок',
          'Дашбоард для умного дома',
          'Панель управления',
          'Магазин PSD',
          'Сервис социальных коллекторских услуг',
          'Клон хабра',
          'Клон вконтакте',
          'Клон фейсбука',
          'Деанонимайзер',
          'To-Do лист',
          'Клон 2048',
          'Клон Flappy Bird',
          'Фитнес-браслет',
          'Reddit',
          'Бенчмарк',
          'Антивирус',
          'Криптовалюта',
          'Диктофон',
          'Телефон',
          'Асоциальная сеть',
          'Очередной блог',
          'Текстовый редактор',
          'Фонарик',
          'Файловый менеджер',
          'CRM',
          'Стриминговый сервис',
          'Twitch.tv',
          'Plug.dj',
          'Google Docs',
          'Pinterest',
          'JS фреймворк',
          'GitHub',
          'Текстовый редактор',
          'Переводчик',
          'Imgur',
          'Облако',
          'Банк',
          'Photoshop',
          'Instagram',
          'Кофемашина',
          'Электрочайник',
          'Тостер',
          'Oculus Rift',
          'Action RPG',
          'Платежный шлюз',
          'MVC фреймворк',
          'Настольная игра',
          'Видеокамера',
          'Роутер',
          'Kanban-доска',
          'Генератор статических сайтов',
          'Генератор вопросов на ЕГЭ',
          'Телефон Nokia',
          'Яндекс'],
  with: [ 'с геолокацией',
          'с интергацией с твиттером',
          'с интеграцией с социальными сетями',
          'с оплатой биткоинами',
          'с блекджеком и шлюхами',
          'с преферансом и дамами',
          'с поддержкой markdown',
          'с поддержкой HTML',
          'с поддержкой Java',
          'с классной анимацией',
          'без регистрации и смс в хорошем качестве',
          'с rss-фидом',
          'с приложениями для мобильных платформ',
          'с монетизацией трафика',
          'с микроплатежами',
          'под андроид',
          'с DLC',
          'с API',
          'с возможностью комментирования',
          'с подстройкой под себя',
          'с двухфакторной авторизацией',
          'с кучей рекламы',
          'на twitter bootstrap',
          'с бэкендом на Parse',
          'с бэкендом на Node.js',
          'на Node.js',
          'на Sinatra',
          'на Django',
          'на Rails',
          'живущий на донат',
          'для Linux',
          'для пожилых людей',
          'для хипстеров',
          'под мобильные платформы',
          'для любителей аниме',
          'для фарма карточек Steam',
          'с большим выбором матерных частушек',
          'для телефонов с J2ME',
          'для людей с ограниченными возможностями',
          'с высоким уровнем анонимности',
          'для молодёжи',
          'с геотаргетингом',
          'с кнопкой "Мне повезёт!"',
          'с возможностью тонкой настройки',
          'без рекламы',
          'с кучей тем оформления',
          'с нескучными обоями',
          'с кнопкой "Share"',
          'без лишних наворотов',
          'с запоминающимся названием',
          'с премиум-аккаунтами',
          'с оплатой по подписке',
          'за 1 доллар в месяц',
          'за 1 доллар в год',
          'для программистов',
          'для социопатов',
          'для фанаток Джастина Бибера',
          'для тех, кому не всё равно',
          'для самых маленьких',
          'для владельцев жигулей',
          'для котов',
          'с голосовым управлением',
          'из Китая',
          'с доставкой Почтой России',
          'с бесплатной доставкой',
          'с платными DLC',
          'с микротранзакциями',
          'под iOS',
          'для Windows',
          'работающий на дровах',
          'для подписчиков MDK',
          'на Flask',
          'на Flash',
          'под Windows 95',
          'под UWP',
          'из Arduino',
          'с различными цветовыми схемами',
          'с кучей кнопочек',
          'с мемами',
          'и чтоб не тормозил',
          'красного цвета',
          'на Wordpress',
          'на Drupal',
          'на Ucoz',
          'на Nokia 3310',
          'без херни',
          'который купит Google и закроет',
          'который взорвёт мир',
          'в PDF',
          'для Windows Phone',
          'для некстген-консолей',
          'для телезрителей',
          'для азиатского рынка',
          'который изменит мир',
          'с Wolfram Alpha',
          'от JetBrains',
          'от Microsoft',
          'от Adobe',
          'от Дениса Попова',
          'от Xiaomi']
};

$(document).ready(function(){
  var generate = function(){
    generateOne();
    generateTwo();
  }

  var generateOne = function(){
    hideHello();
    $("#part-one").fadeOut(150, function(){
      $(this).text(variants.what[Math.floor(Math.random()*variants.what.length)]);
      social();
      $(this).fadeIn(250);
    });
    hideHello();
  }

  var generateTwo = function(){
    hideHello();
    $("#part-two").fadeOut(150, function(){
      $(this).text(variants.with[Math.floor(Math.random()*variants.with.length)]);
      social();
      $(this).fadeIn(250);
    });
  }

  var hideHello = function(){
    $("#hello").fadeOut(150);
  }

  var social = function(){
    var rand = Math.floor(Math.random()*10000000);
    var text = "Моя идея стартапа: " + $("#part-one").text() + " " + $("#part-two").text() + ".";
    $("#tweet").attr("href", "https://twitter.com/home?status=" + text + " http://git.io/vqU3L");
    $("#vkshare").attr("href", "https://vk.com/share.php?url=http://4ndv.github.io/startupideas/?" + rand + "&title=Генератор идей стартапов. " + text + " Получи свою здесь!" + "&description=Генератор идей стартапов v3.0")
  }

  $("#generate").click(generate);
  $("#part-one").click(generateOne);
  $("#part-two").click(generateTwo);
});
<commit_msg>Больше идей от github.com/ctl<commit_after>// А ты как себе это представлял?

var variants = {
  what: [ 'API для чистки зубов',
          'Пивной ларек',
          'Wysiwyg редактор',
          'Офисный пакет',
          'Скриншотер',
          'Клон Dota',
          'Шутер',
          'Виртуальная машина',
          'Стратегия',
          'RPG',
          'Песочница',
          'Приложение вконтакте',
          'Приложение facebook',
          'Эмулятор Windows',
          'IDE',
          'Skype',
          'Анонимный чат',
          'Блогохостинг',
          'Видео-хостинг',
          'Видео-чат',
          'Генератор идей',
          'Движок для форумов',
          'Доска объявлений',
          'Коллективный блог',
          'Музыкальный сервис',
          'Новостной портал',
          'Облачный хостинг',
          'Онлайн-библиотека',
          'Операционная система',
          'Поисковая система',
          'Почтовый сервис',
          'Процессинг карт',
          'Сервис микроблоггинга',
          'Торрент-трекер',
          'Файлообменник',
          'Фотохостинг',
          'Хостинг',
          'Чат',
          'CMS',
          'Дистрибутив линукса',
          'Социальная сеть',
          'Цитатник',
          'Веб-браузер',
          'Каталог jQuery-плагинов',
          'Вики',
          'Сервис координации флешмобов',
          'MMORPG',
          'Фоторедактор',
          'Онлайн-рисовалка',
          'Хостинг исходников',
          'Сайт о путешествиях',
          'Кулинарный сайт',
          'Погода',
          'Будильник',
          'RSS-ридер',
          'Калькулятор',
          'Сайт знакомств для животных',
          'Онлайн-университет',
          'Блокировщик рекламы',
          'Сайт с видео-уроками по вышиванию',
          'Закрытое сообщество',
          'Сервис поиска собутыльников',
          'Система проверки на плагиат',
          'Сокращатель ссылок',
          'Сервис подбора музыки',
          'Сервис подбора платьев',
          'Сервис подбора причесок',
          'Сервис подбора хостинга',
          'Сервис подбора CMS',
          'Сервис подбора ресторанов',
          'Онлайн-аукцион',
          'Магазин футболок',
          'Магазин носков',
          'Сервис мгновенных сообщений',
          'Сервис голосовых сообщений',
          'Планировщик',
          'Календарь',
          'Навигатор',
          'Эмулятор старых консолей',
          'Судоку',
          'IQ-тест',
          'Сервис микроплатежей',
          'Аггрегатор новостей',
          'Сервис облачных бекапов',
          'CDN',
          'Сервис ВиО',
          'Табличный процессор',
          'Кнопки соцсетей',
          'Система комментариев на сайт',
          'Поиск для сайта',
          'Онлайн-кинотеатр',
          'Система статистики',
          'Хостинг портфолио',
          'Онлайн музыкальный редактор',
          'Музыкальный плеер',
          'Видео плеер',
          'Онлайн-радио',
          'Сайт знакомств',
          'Сервис сайтов-визиток',
          'Карты',
          'Защищенный мессенджер',
          'Анонимайзер',
          'Записная книга',
          'Сервис быстрых заметок',
          'Дашбоард для умного дома',
          'Панель управления',
          'Магазин PSD',
          'Сервис социальных коллекторских услуг',
          'Клон хабра',
          'Клон вконтакте',
          'Клон фейсбука',
          'Деанонимайзер',
          'To-Do лист',
          'Клон 2048',
          'Клон Flappy Bird',
          'Фитнес-браслет',
          'Reddit',
          'Бенчмарк',
          'Антивирус',
          'Криптовалюта',
          'Диктофон',
          'Телефон',
          'Асоциальная сеть',
          'Очередной блог',
          'Текстовый редактор',
          'Фонарик',
          'Файловый менеджер',
          'CRM',
          'Стриминговый сервис',
          'Twitch.tv',
          'Plug.dj',
          'Google Docs',
          'Pinterest',
          'JS фреймворк',
          'GitHub',
          'Текстовый редактор',
          'Переводчик',
          'Imgur',
          'Облако',
          'Банк',
          'Photoshop',
          'Instagram',
          'Кофемашина',
          'Электрочайник',
          'Тостер',
          'Oculus Rift',
          'Action RPG',
          'Платежный шлюз',
          'MVC фреймворк',
          'Настольная игра',
          'Видеокамера',
          'Роутер',
          'Kanban-доска',
          'Генератор статических сайтов',
          'Генератор вопросов на ЕГЭ',
          'Телефон Nokia',
          'Яндекс',
          'Minecraft',
          'PlayStation 4',
          'Overwatch',
          'Steam'
        ],
  with: [ 'с геолокацией',
          'с интергацией с твиттером',
          'с интеграцией с социальными сетями',
          'с оплатой биткоинами',
          'с блекджеком и шлюхами',
          'с преферансом и дамами',
          'с поддержкой markdown',
          'с поддержкой HTML',
          'с поддержкой Java',
          'с классной анимацией',
          'без регистрации и смс в хорошем качестве',
          'с rss-фидом',
          'с приложениями для мобильных платформ',
          'с монетизацией трафика',
          'с микроплатежами',
          'под андроид',
          'с DLC',
          'с API',
          'с возможностью комментирования',
          'с подстройкой под себя',
          'с двухфакторной авторизацией',
          'с кучей рекламы',
          'на twitter bootstrap',
          'с бэкендом на Parse',
          'с бэкендом на Node.js',
          'на Node.js',
          'на Sinatra',
          'на Django',
          'на Rails',
          'живущий на донат',
          'для Linux',
          'для пожилых людей',
          'для хипстеров',
          'под мобильные платформы',
          'для любителей аниме',
          'для фарма карточек Steam',
          'с большим выбором матерных частушек',
          'для телефонов с J2ME',
          'для людей с ограниченными возможностями',
          'с высоким уровнем анонимности',
          'для молодёжи',
          'с геотаргетингом',
          'с кнопкой "Мне повезёт!"',
          'с возможностью тонкой настройки',
          'без рекламы',
          'с кучей тем оформления',
          'с нескучными обоями',
          'с кнопкой "Share"',
          'без лишних наворотов',
          'с запоминающимся названием',
          'с премиум-аккаунтами',
          'с оплатой по подписке',
          'за 1 доллар в месяц',
          'за 1 доллар в год',
          'для программистов',
          'для социопатов',
          'для фанаток Джастина Бибера',
          'для тех, кому не всё равно',
          'для самых маленьких',
          'для владельцев жигулей',
          'для котов',
          'с голосовым управлением',
          'из Китая',
          'с доставкой Почтой России',
          'с бесплатной доставкой',
          'с платными DLC',
          'с микротранзакциями',
          'под iOS',
          'для Windows',
          'работающий на дровах',
          'для подписчиков MDK',
          'на Flask',
          'на Flash',
          'под Windows 95',
          'под UWP',
          'из Arduino',
          'с различными цветовыми схемами',
          'с кучей кнопочек',
          'с мемами',
          'и чтоб не тормозил',
          'красного цвета',
          'на Wordpress',
          'на Drupal',
          'на Ucoz',
          'на Nokia 3310',
          'без херни',
          'который купит Google и закроет',
          'который взорвёт мир',
          'в PDF',
          'для Windows Phone',
          'для некстген-консолей',
          'для телезрителей',
          'для азиатского рынка',
          'который изменит мир',
          'с Wolfram Alpha',
          'от JetBrains',
          'от Microsoft',
          'от Adobe',
          'от Дениса Попова',
          'от Xiaomi',
          'от Mojang',
          'от Valve'
        ]
};

$(document).ready(function(){
  var generate = function(){
    generateOne();
    generateTwo();
  }

  var generateOne = function(){
    hideHello();
    $("#part-one").fadeOut(150, function(){
      $(this).text(variants.what[Math.floor(Math.random()*variants.what.length)]);
      social();
      $(this).fadeIn(250);
    });
    hideHello();
  }

  var generateTwo = function(){
    hideHello();
    $("#part-two").fadeOut(150, function(){
      $(this).text(variants.with[Math.floor(Math.random()*variants.with.length)]);
      social();
      $(this).fadeIn(250);
    });
  }

  var hideHello = function(){
    $("#hello").fadeOut(150);
  }

  var social = function(){
    var rand = Math.floor(Math.random()*10000000);
    var text = "Моя идея стартапа: " + $("#part-one").text() + " " + $("#part-two").text() + ".";
    $("#tweet").attr("href", "https://twitter.com/home?status=" + text + " http://git.io/vqU3L");
    $("#vkshare").attr("href", "https://vk.com/share.php?url=http://4ndv.github.io/startupideas/?" + rand + "&title=Генератор идей стартапов. " + text + " Получи свою здесь!" + "&description=Генератор идей стартапов v3.0")
  }

  $("#generate").click(generate);
  $("#part-one").click(generateOne);
  $("#part-two").click(generateTwo);
});
<|endoftext|>


<commit_before>var init = function (initialise_callback) {
		var lisp_fns = {
				"+": {
					"minArity": 0,
					"maxArity": Infinity,
					"dataType": "number",
					"fn": function (args) {
						var rtn = 0; // CLISP returns 0 if `+` is given no arguments.
						while (args.length) {
							rtn += args.shift();
						};
						return rtn;
					}
				},
				"-": function (args) {
					var rtn = args.shift();
					while (args.length) {
						rtn -= args.shift();
					};
					return rtn;
				},
				"*": function (args) {
					var rtn = 1; // CLISP returns 1 if `*` is given no arguments.
					while (args.length) {
						rtn *= args.shift();
					};
					return rtn;
				},
				"/": function (args) {
					var rtn = args.shift();
					while (args.length) {
						rtn /= args.shift();
					}
					return rtn;
				}
			},

			wrap_function = function (fn_object) {

				// Decide on how the function should be accessed.
				var fn = fn_object.fn || fn_object,
					maxArity = fn_object.maxArity || Infinity,
					minArity = fn_object.minArity || 0,
					dataType = fn_object.dataType || [ "number", "string" ],
					checkType = function (arg) {
						var rtn = false,
							d;
						if (dataType instanceof Array) {
							for (d = dataType.length - 1; (d + 1) && !rtn; d -= 1) {
								rtn = (typeof arg === dataType[d]);
							}
						} else if (typeof dataType === "string") {
							rtn = typeof arg === dataType;
						}
						return rtn;
					};

				return function (args) {
					var rtn = {},
						func_rtn,
						a,
						unpacked = [];

					if (args instanceof Array) {
						a = args.length;

						if (a > maxArity) {
							rtn.error = "Test error message. Too many arguments.";
						} else if (a < minArity) {
							rtn.error = "Test error message. Too few arguments.";
						}

						// Search for any one argument that goes against type, whilst unpacking.
						for (; a && checkType(unpacked[a - 1] = (args[a - 1].value || args[a - 1])); a -= 1); // no body

						// When a is falsy, the arguments are type-safe.
						if (!a) {
							func_rtn = fn(unpacked);
							if (typeof func_rtn === "object" && (func_rtn.hasOwnProperty("value") || func_rtn.hasOwnProperty("error"))) {
								rtn = func_rtn;
							} else {
								rtn.value = func_rtn;
							}
						} else {
							rtn.error = "The argument " + (args[a - 1].value || args[a - 1]) + " was the wrong type.";
						}
					} else {
						rtn.error = "Fault with Lijst. Arguments not passed as array.";
					}
					return rtn;
				}
			},

			separate_terms = function (input) {
				var str = input,
					arr = [],
					rst = "",
					rex = /(\s+)|(")|(\()|(\))|(.$)/g,
					begin_term = 0,
					end_term = 0,
					paren_level = 0,
					quote_level = false,
					rfn = function ($m, $1, $2, $3, $4, $5, offset, whole_string) {
						var out;
						if ($2 && !paren_level) {
							console.log(quote_level);
							quote_level = !quote_level;
							if (quote_level) {
								begin_term = offset;
							} else {
								end_term = offset + $m.length;
								out = whole_string.slice(begin_term, end_term);
								begin_term = end_term;
							}
						} else if ($3 && !quote_level) {
							paren_level += 1;
							if (!paren_level) {
								begin_term = offset;
							}
						} else if ($4 && !quote_level) {
							paren_level -= 1;
							if (!paren_level) {
								end_term = offset + $m.length;
								out = whole_string.slice(begin_term, end_term);
								begin_term = end_term;
							}
						} else if ($1 && !paren_level && !quote_level) {
							end_term = offset;
							out = whole_string.slice(begin_term, end_term);
							begin_term = end_term + $m.length;
						} else if ($5 && !quote_level) {
							end_term = whole_string.length;
							out = whole_string.slice(begin_term, end_term);
							begin_term = end_term + $m.length;
						}

						if (out) { arr.push(out); };
						return $m;
					};

				rst = str.replace(rex, rfn);
				return arr;
			},

			evaluate_term = function (term) {
				var rtn,
					arr,
					fun,
					arg = [],
					term = term[0];
				if (/\D/g.test(term)) {
					if (/^\(.*\)$/.test(term)) {
						if (term.slice(1, -1)) {
							arr = separate_terms(term.slice(1, -1));
							fun = arr.shift();
							while (arr.length) {
								arg.push(evaluate_term(arr.splice(0, 1)));
							}
							if (lisp_fns.hasOwnProperty(fun)) {
								rtn = lisp_fns[fun](arg);
							} else {
								// TODO: What if there is no such function?
							}
						} else {
							// If parentheses are empty.
							rtn = "NIL";
						}
					} else if (/^".*"$/g.test(term)) {
						console.log(term);
						rtn = term;
					}
				} else {
					rtn = +term;
				}
				return rtn;
			},

			// Top-level processing of input.
			process_input = function (input, callback_each_term) {
				var rtn,
					arr = separate_terms(input),
					rst;

				while (arr.length) {
					// Extract first term from array and evaluate.
					rst = evaluate_term(arr.splice(0, 1));
					// Do something with the input and results.
					callback_each_term(input, print_result(rst));
					// Reset the input. We have already done something with it once.
					input = "";
				}

				return rtn;
			},

			print_result = function (result) {
				var rtn;
				if (result.hasOwnProperty("value")) {
					if (typeof result.value === "number") {
						rtn = "" + result.value;
					} else {
						rtn = result.value;
					}
				} else if (result.hasOwnProperty("error")) {
					rtn = result.error;
				} else {
					rtn = "Error at printing stage. No value or processing error found.";
				}
				return rtn;
			},

			f;

		// Wrap predefined lisp functions in error-checking function.
		for (f in lisp_fns) {
			if (lisp_fns.hasOwnProperty(f)) {
				lisp_fns[f] = wrap_function(lisp_fns[f]);
			}
		}

		evaluate_term = wrap_function(evaluate_term);

		initialise_callback();

		return {
			process_input: process_input
		};

	};

// Node JS compatibility
if (typeof exports !== "undefined") {
	exports.init = init;
}<commit_msg>Changed print_result to look more like Lisp error message.<commit_after>var init = function (initialise_callback) {
		var lisp_fns = {
				"+": {
					"minArity": 0,
					"maxArity": Infinity,
					"dataType": "number",
					"fn": function (args) {
						var rtn = 0; // CLISP returns 0 if `+` is given no arguments.
						while (args.length) {
							rtn += args.shift();
						};
						return rtn;
					}
				},
				"-": function (args) {
					var rtn = args.shift();
					while (args.length) {
						rtn -= args.shift();
					};
					return rtn;
				},
				"*": function (args) {
					var rtn = 1; // CLISP returns 1 if `*` is given no arguments.
					while (args.length) {
						rtn *= args.shift();
					};
					return rtn;
				},
				"/": function (args) {
					var rtn = args.shift();
					while (args.length) {
						rtn /= args.shift();
					}
					return rtn;
				}
			},

			wrap_function = function (fn_object) {

				// Decide on how the function should be accessed.
				var fn = fn_object.fn || fn_object,
					maxArity = fn_object.maxArity || Infinity,
					minArity = fn_object.minArity || 0,
					dataType = fn_object.dataType || [ "number", "string" ],
					checkType = function (arg) {
						var rtn = false,
							d;
						if (dataType instanceof Array) {
							for (d = dataType.length - 1; (d + 1) && !rtn; d -= 1) {
								rtn = (typeof arg === dataType[d]);
							}
						} else if (typeof dataType === "string") {
							rtn = typeof arg === dataType;
						}
						return rtn;
					};

				return function (args) {
					var rtn = {},
						func_rtn,
						a,
						unpacked = [];

					if (args instanceof Array) {
						a = args.length;

						if (a > maxArity) {
							rtn.error = "too many arguments";
						} else if (a < minArity) {
							rtn.error = "too few arguments";
						}

						// Search for any one argument that goes against type, whilst unpacking.
						for (; a && checkType(unpacked[a - 1] = (args[a - 1].value || args[a - 1])); a -= 1); // no body

						// When a is falsy, the arguments are type-safe.
						if (!a) {
							func_rtn = fn(unpacked);
							if (typeof func_rtn === "object" && (func_rtn.hasOwnProperty("value") || func_rtn.hasOwnProperty("error"))) {
								rtn = func_rtn;
							} else {
								rtn.value = func_rtn;
							}
						} else {
							rtn.error = "The argument " + (args[a - 1].value || args[a - 1]) + " was the wrong type.";
						}
					} else {
						rtn.error = "Fault with Lijst. Arguments not passed as array.";
					}
					return rtn;
				}
			},

			separate_terms = function (input) {
				var str = input,
					arr = [],
					rst = "",
					rex = /(\s+)|(")|(\()|(\))|(.$)/g,
					begin_term = 0,
					end_term = 0,
					paren_level = 0,
					quote_level = false,
					rfn = function ($m, $1, $2, $3, $4, $5, offset, whole_string) {
						var out;
						if ($2 && !paren_level) {
							console.log(quote_level);
							quote_level = !quote_level;
							if (quote_level) {
								begin_term = offset;
							} else {
								end_term = offset + $m.length;
								out = whole_string.slice(begin_term, end_term);
								begin_term = end_term;
							}
						} else if ($3 && !quote_level) {
							paren_level += 1;
							if (!paren_level) {
								begin_term = offset;
							}
						} else if ($4 && !quote_level) {
							paren_level -= 1;
							if (!paren_level) {
								end_term = offset + $m.length;
								out = whole_string.slice(begin_term, end_term);
								begin_term = end_term;
							}
						} else if ($1 && !paren_level && !quote_level) {
							end_term = offset;
							out = whole_string.slice(begin_term, end_term);
							begin_term = end_term + $m.length;
						} else if ($5 && !quote_level) {
							end_term = whole_string.length;
							out = whole_string.slice(begin_term, end_term);
							begin_term = end_term + $m.length;
						}

						if (out) { arr.push(out); };
						return $m;
					};

				rst = str.replace(rex, rfn);
				return arr;
			},

			evaluate_term = function (term) {
				var rtn,
					arr,
					fun,
					arg = [],
					term = term[0];
				if (/\D/g.test(term)) {
					if (/^\(.*\)$/.test(term)) {
						if (term.slice(1, -1)) {
							arr = separate_terms(term.slice(1, -1));
							fun = arr.shift();
							while (arr.length) {
								arg.push(evaluate_term(arr.splice(0, 1)));
							}
							if (lisp_fns.hasOwnProperty(fun)) {
								rtn = lisp_fns[fun](arg);
							} else {
								// TODO: What if there is no such function?
							}
						} else {
							// If parentheses are empty.
							rtn = "NIL";
						}
					} else if (/^".*"$/g.test(term)) {
						console.log(term);
						rtn = term;
					}
				} else {
					rtn = +term;
				}
				return rtn;
			},

			// Top-level processing of input.
			process_input = function (input, callback_each_term) {
				var rtn,
					arr = separate_terms(input),
					rst;

				while (arr.length) {
					// Extract first term from array and evaluate.
					rst = evaluate_term(arr.splice(0, 1));
					// Do something with the input and results.
					callback_each_term(input, print_result(rst));
					// Reset the input. We have already done something with it once.
					input = "";
				}

				return rtn;
			},

			print_result = function (result) {
				var rtn;
				if (result.hasOwnProperty("value")) {
					if (typeof result.value === "number") {
						rtn = "" + result.value;
					} else {
						rtn = result.value;
					}
				} else if (result.hasOwnProperty("error")) {
					rtn = "*** - " + result.error;
				} else {
					rtn = "Error at printing stage. No value or processing error found.";
				}
				return rtn;
			},

			f;

		// Wrap predefined lisp functions in error-checking function.
		for (f in lisp_fns) {
			if (lisp_fns.hasOwnProperty(f)) {
				lisp_fns[f] = wrap_function(lisp_fns[f]);
			}
		}

		evaluate_term = wrap_function(evaluate_term);

		initialise_callback();

		return {
			process_input: process_input
		};

	};

// Node JS compatibility
if (typeof exports !== "undefined") {
	exports.init = init;
}<|endoftext|>


<commit_before>import assert from 'assert';

describe('test setup works?', function() {
  it('i hope', function() {
    assert.equal(1, 1);
  });
});

function tick() {
  return { positions:[] };
}
function newUniverseWithOneCellFrom(universe, position) {
  return {positions: [universe.positions[position]]};
}
describe('universe', function() {
  describe('next generation', function() {
    it('of empty universe is empty', function() {
      let universe = {
        positions: []
      };

      let nextGeneration = tick();

      assert.deepEqual(nextGeneration, { positions:[] });
    });

    it('of one cell is empty', function() {
      let universe = {
        positions: [{}]
      };

      let nextGeneration = tick();

      assert.deepEqual(nextGeneration, { positions:[] } );
    });

    // first step to think of universe as single cell because only one cells
    // survives and we place other cells accordingly.
    it('of three diagonal cells contains middle cell', function() {
      let universe = {
        positions: [
          { x:1, y:1 },
          { x:0, y:0 },
          { x:2, y:2 }
        ]
      };

      let positionName = 0;
      let nextGeneration = newUniverseWithOneCellFrom(universe, positionName);

      assert.deepEqual(nextGeneration, {positions: [{x: 1, y: 1}]});
    });

    it('of three diagonal2 cells contains middle cell', function() {
      let universe = {
        positions: [
          { x:0, y:0 },
          { x:1, y:1 },
          { x:2, y:2 }
        ]
      };

      let nextGeneration = newUniverseWithOneCellFrom(universe, 1);

      assert.deepEqual(nextGeneration, {positions: [{x: 1, y: 1}]});
    });
  });
});<commit_msg>Add some todos for where to start in the next session.<commit_after>import assert from 'assert';

describe('test setup works?', function() {
  it('i hope', function() {
    assert.equal(1, 1);
  });
});

function tick() {
  return { positions:[] };
}
function newUniverseWithOneCellFrom(universe, position) {
  return {positions: [universe.positions[position]]};
}
describe('universe', function() {
  describe('next generation', function() {
    it('of empty universe is empty', function() {
      let universe = {
        positions: []
      };

      let nextGeneration = tick();

      assert.deepEqual(nextGeneration, { positions:[] });
    });

    it('of one cell is empty', function() {
      let universe = {
        positions: [{}]
      };

      let nextGeneration = tick();

      assert.deepEqual(nextGeneration, { positions:[] } );
    });

    // first step to think of universe as single cell because only one cells
    // survives and we place other cells accordingly.
    it('of three diagonal cells contains middle cell', function() {
      let universe = {
        positions: [
          { x:1, y:1 }, // TODO the position is duplicated many times, extract
          { x:0, y:0 },
          { x:2, y:2 }
        ]
      };

      let positionName = 0;
      let nextGeneration = newUniverseWithOneCellFrom(universe, positionName);

      assert.deepEqual(nextGeneration, {positions: [{x: 1, y: 1}]});
    });

    it('of three diagonal2 cells contains middle cell', function() {
      let universe = {
        positions: [
          { x:0, y:0 },
          { x:1, y:1 },
          { x:2, y:2 }
        ]
      };

      // TODO we need to determine 1 from the universe somehow. this is the
      // rule for survival. then we can extract 49 and 65 into new tick method
      // and combine with existing one. maybe.
      let nextGeneration = newUniverseWithOneCellFrom(universe, 1);

      assert.deepEqual(nextGeneration, {positions: [{x: 1, y: 1}]});
    });
  });
});<|endoftext|>


<commit_before>import assert from 'assert';

describe('test setup works?', function() {
  it('i hope', function() {
    assert.equal(1, 1);
  });
});

function tick() {
  return { positions:[] };
}
function newUniverseWithOneCellFrom(universe, position) {
  return {positions: [universe.positions[position]]};
}
describe('universe', function() {
  describe('next generation', function() {
    it('of empty universe is empty', function() {
      let universe = {
        positions: []
      };

      let nextGeneration = tick();

      assert.deepEqual(nextGeneration, { positions:[] });
    });

    it('of one cell is empty', function() {
      let universe = {
        positions: [{}]
      };

      let nextGeneration = tick();

      assert.deepEqual(nextGeneration, { positions:[] } );
    });

    // first step to think of universe as single cell because only one cell
    // survives and we place other cells accordingly.
    it('of three diagonal cells contains middle cell', function() {
      let universe = {
        positions: [
          { x:1, y:1 }, // TODO the position is duplicated many times, extract
          { x:0, y:0 },
          { x:2, y:2 }
        ]
      };

      let positionIndex = 0;
      let nextGeneration = newUniverseWithOneCellFrom(universe, positionIndex);

      assert.deepEqual(nextGeneration, {positions: [{x: 1, y: 1}]});
    });

    it('of three diagonal cells (in different order) contains middle cell', function() {
      let universe = {
        positions: [
          { x:0, y:0 },
          { x:1, y:1 },
          { x:2, y:2 }
        ]
      };

      // TODO we need to determine 1 from the universe somehow. this is the
      // rule for survival. then we can extract 49 and 66 into new tick method
      // and combine with existing one. maybe <- ;-)
      let positionIndex = 1;
      let nextGeneration = newUniverseWithOneCellFrom(universe, positionIndex);

      assert.deepEqual(nextGeneration, {positions: [{x: 1, y: 1}]});
    });

    it('of three diagonal cells (in another order) contains middle cell', function() {
      let universe = {
        positions: [
          { x:0, y:0 },
          { x:2, y:2 },
          { x:1, y:1 }
        ]
      };

      let positionIndex = 2;
      let nextGeneration = newUniverseWithOneCellFrom(universe, positionIndex);

      assert.deepEqual(nextGeneration, {positions: [{x: 1, y: 1}]});
    });
  });
});<commit_msg>Make duplication more explicit.<commit_after>import assert from 'assert';

describe('test setup works?', function() {
  it('i hope', function() {
    assert.equal(1, 1);
  });
});

function tick() {
  return { positions:[] };
}
function newUniverseWithOneCellFrom(universe, position) {
  return {positions: [universe.positions[position]]};
}
describe('universe', function() {
  describe('next generation', function() {
    it('of empty universe is empty', function() {
      let universe = {
        positions: []
      };

      let nextGeneration = tick();

      assert.deepEqual(nextGeneration, { positions:[] });
    });

    it('of one cell is empty', function() {
      let universe = {
        positions: [{}]
      };

      let nextGeneration = tick();

      assert.deepEqual(nextGeneration, { positions:[] } );
    });

    // first step to think of universe as single cell because only one cell
    // survives and we place other cells accordingly.
    it('of three diagonal cells contains middle cell', function() {
      let universe = {
        positions: [
          { x:1, y:1 }, // TODO the position is duplicated many times, extract
          { x:0, y:0 },
          { x:2, y:2 }
        ]
      };

      let positionIndex = 0;
      let nextGeneration = newUniverseWithOneCellFrom(universe, positionIndex);

      assert.deepEqual(nextGeneration, {positions: [{x: 1, y: 1}]});
    });

    it('of three diagonal cells (in different order) contains middle cell', function() {
      let universe = {
        positions: [
          { x:0, y:0 },
          { x:1, y:1 },
          { x:2, y:2 }
        ]
      };
      let surviverIndex = 1;
      universe.positions[surviverIndex] = {x:1, y:1};

      // TODO we need to determine 1 from the universe somehow. this is the
      // rule for survival. then we can extract 49 and 66 into new tick method
      // and combine with existing one. maybe <- ;-)
      let positionIndex = surviverIndex;
      let nextGeneration = newUniverseWithOneCellFrom(universe, positionIndex);

      assert.deepEqual(nextGeneration, {positions: [{x: 1, y: 1}]});
    });

    it('of three diagonal cells (in another order) contains middle cell', function() {
      let universe = {
        positions: [
          { x:0, y:0 },
          { x:2, y:2 },
          { x:1, y:1 }
        ]
      };

      // TODO positionIndex is the index that has two neighbours
      let positionIndex = 2;
      let nextGeneration = newUniverseWithOneCellFrom(universe, positionIndex);

      assert.deepEqual(nextGeneration, {positions: [{x: 1, y: 1}]});
    });
  });
});<|endoftext|>


<commit_before>/**
 *
 */

var ws=require('ws');

var testNumber=0;

function EchoTest(BridgeProxy, AutoConnectProxy, config, callbackFn){

	var cleanup=function(){}; //reassigned

	var callback=function(err, msg){
		callbackFn(err, msg);
		cleanup();
		callback=function(){}; //avoid multiple executions, but don't worry about it below.
	}

	var test=testNumber;
	testNumber++;
	console.log('Running Test: '+test);
	//a ws server that just echos back all messages...
	var echo=(new ws.Server({
		port: config.echo
	},function(){

		cleanup=function(){
			echo.close();
		}

		var basicauth='';
		basicauth='nickolanack:nick';

//		a bridge server. pairs clients with autoconnect proxy connections.
		var WSBridge=require('../bridgeproxy.js');
		var bridge=new WSBridge({
			port:config.bridge,
			basicauth:basicauth
		}, function(){

			var WSAuto=require('../autoconnectproxy.js');

			cleanup=function(){
				echo.close();
				bridge.close();
				autoconnect.close();
			}

			if(basicauth.length){
				basicauth=basicauth+'@';
			}
			var autoconnect=new WSAuto({source:'ws://'+basicauth+'localhost:'+config.bridge, destination:'ws://localhost:'+config.echo}).on('error',function(err){
				callback(new Error('test '+test+' autoconnectproxy error'));
			});

			var clients=0;

			if(typeof(config.beforeTest)=='function'){
				config.beforeTest({
					echo:echo,
					bridge:bridge,
					autoconnect:autoconnect
				});
			}

			var num=config.count;
			for(var i=0;i< num; i++){

				clients++;
				(function(i){
					var success=false;
					var client=new ws('ws://localhost:'+config.bridge);

					client.on('open', function(){
						setTimeout(function(){
							var tm=setTimeout(function(){
								callback(new Error('test '+test+' client#'+i+' expected response by now.'));
							}, 10000);
								client.on('message',function(message){

									if(message!=='hello world'){
										callback(new Error('test '+test+' client#'+i+' expected "hello world", recieved "'+message+'"'));
									}else{

										//was logging a success message here.

									}

									success=true;
									clearTimeout(tm);
									this.close();
									clients--;
									if(clients==0){

										setTimeout(function(){
											callback(null); //success
											cleanup();
										},100);

									}
								});
								//console.log('test client #'+i+' sends: hello world');

								client.send('hello world');

						}, i*50);

					}).on('close', function(code, message){

						if(!success){
							callback(new Error('test '+test+' client#'+i+' closed before sending anything: '+code+(message?' - '+message:'')));

						}

					}).on('error',function(error){

						callback(new Error('test '+test+' client#'+i+' error: '+error));

					});

					if((typeof config.eachClient)=='function'){
						config.eachClient(client, i);
					}

				})(i);

			}

		});

	})).on('connection', function(wsclient){

		wsclient.on('message',function(message){
			wsclient.send(message);
			//console.log('endpoint echos: '+message);
		})

	});

}

//helper
function logAutoconnectProxy(acp){
	console.log('adding logger');
	acp.on('source.connect',function(source){

		source.on('open',function(){
			console.log('autoconnect created proxy: there are '+acp.connectionPoolCount()+' ready sockets');
		}).on('message', function message(data, flags) {
			console.log('autoconnect proxy source sends: '+(typeof data));
		}).on('close',function(code, message){
			console.log('autoconnect proxy source close: '+code+' '+message);
		}).on('error',function(error){
			console.log('autoconnect proxy source error: '+error);
		});

	}).on('destination.connect',function(destination){

		destination.on('message', function message(data, flags) {
			console.log('autoconnect proxy destination sends: '+(typeof data));
		}).on('error',function(error){
			console.error('autoconnect proxy destination error: '+error+' | '+(typeof error));
		}).on('close',function(code, message){
			console.log('autoconnect proxy destination close: '+code+' '+message);
		});

	});

}

module.exports=EchoTest;

<commit_msg>fix classes<commit_after>/**
 *
 */

var ws=require('ws');

var testNumber=0;

function EchoTest( AutoConnectProxy,BridgeProxy, config, callbackFn){

	var cleanup=function(){}; //reassigned

	var callback=function(err, msg){
		callbackFn(err, msg);
		cleanup();
		callback=function(){}; //avoid multiple executions, but don't worry about it below.
	}

	var test=testNumber;
	testNumber++;
	console.log('Running Test: '+test);
	//a ws server that just echos back all messages...
	var echo=(new ws.Server({
		port: config.echo
	},function(){

		cleanup=function(){
			echo.close();
		}

		var basicauth='';
		basicauth='nickolanack:nick';

		var bridge=new BridgeProxy({
			port:config.bridge,
			basicauth:basicauth
		}, function(){

			cleanup=function(){
				echo.close();
				bridge.close();
				autoconnect.close();
			}

			if(basicauth.length){
				basicauth=basicauth+'@';
			}
			var autoconnect=new AutoConnectProxy({source:'ws://'+basicauth+'localhost:'+config.bridge, destination:'ws://localhost:'+config.echo}).on('error',function(err){
				callback(new Error('test '+test+' autoconnectproxy error'));
			});

			var clients=0;

			if(typeof(config.beforeTest)=='function'){
				config.beforeTest({
					echo:echo,
					bridge:bridge,
					autoconnect:autoconnect
				});
			}

			var num=config.count;
			for(var i=0;i< num; i++){

				clients++;
				(function(i){
					var success=false;
					var client=new ws('ws://localhost:'+config.bridge);

					client.on('open', function(){
						setTimeout(function(){
							var tm=setTimeout(function(){
								callback(new Error('test '+test+' client#'+i+' expected response by now.'));
							}, 10000);
								client.on('message',function(message){

									if(message!=='hello world'){
										callback(new Error('test '+test+' client#'+i+' expected "hello world", recieved "'+message+'"'));
									}else{

										//was logging a success message here.

									}

									success=true;
									clearTimeout(tm);
									this.close();
									clients--;
									if(clients==0){

										setTimeout(function(){
											callback(null); //success
											cleanup();
										},100);

									}
								});
								//console.log('test client #'+i+' sends: hello world');

								client.send('hello world');

						}, i*50);

					}).on('close', function(code, message){

						if(!success){
							callback(new Error('test '+test+' client#'+i+' closed before sending anything: '+code+(message?' - '+message:'')));

						}

					}).on('error',function(error){

						callback(new Error('test '+test+' client#'+i+' error: '+error));

					});

					if((typeof config.eachClient)=='function'){
						config.eachClient(client, i);
					}

				})(i);

			}

		});

	})).on('connection', function(wsclient){

		wsclient.on('message',function(message){
			wsclient.send(message);
			//console.log('endpoint echos: '+message);
		})

	});

}

//helper
function logAutoconnectProxy(acp){
	console.log('adding logger');
	acp.on('source.connect',function(source){

		source.on('open',function(){
			console.log('autoconnect created proxy: there are '+acp.connectionPoolCount()+' ready sockets');
		}).on('message', function message(data, flags) {
			console.log('autoconnect proxy source sends: '+(typeof data));
		}).on('close',function(code, message){
			console.log('autoconnect proxy source close: '+code+' '+message);
		}).on('error',function(error){
			console.log('autoconnect proxy source error: '+error);
		});

	}).on('destination.connect',function(destination){

		destination.on('message', function message(data, flags) {
			console.log('autoconnect proxy destination sends: '+(typeof data));
		}).on('error',function(error){
			console.error('autoconnect proxy destination error: '+error+' | '+(typeof error));
		}).on('close',function(code, message){
			console.log('autoconnect proxy destination close: '+code+' '+message);
		});

	});

}

module.exports=EchoTest;

<|endoftext|>


<commit_before>/*eslint-env node, mocha */
var chai = require('chai');
var assert = chai.assert,
    expect = chai.expect,
    should = chai.should();

var replacements = require('../scripts/replacements.js');
var cleanup = require('../scripts/cleanup.js');

describe("common contractions", function() {
    it("should fix I'd", function() {
        var testString = "But they'd never met anyone from LoD.  Even some of the";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("But they’d never met anyone from LoD.  Even some of the")
    });
    it("should fix he'll", function() {
        var testString = "He'll shrieve my soul, he'll wash away";  // Rime of the Ancient Mariner
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("He’ll shrieve my soul, he’ll wash away")
    });
    it("should fix I'm", function() {
        var testString = "SCARED of a guy like that.  But I'm not scared.\nI'm from Chicago.  I'm gonna hunt him down.";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("SCARED of a guy like that.  But I’m not scared.\nI’m from Chicago.  I’m gonna hunt him down.")
    });
    it("should fix you're", function() {
        var testString = "They're not black or white, or Establishment or Underground,";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("They’re not black or white, or Establishment or Underground,")
    });
    it("should fix it's", function() {
        var testString = "digital underground: it's probably the most pirated piece";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("digital underground: it’s probably the most pirated piece")
    });
    it("should fix don't", function() {
        var testString = "everlasting fire... don't you feel it? Blind, chockfull of sin! Repent,";  // Conrad 'Narcissus'
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("everlasting fire... don’t you feel it? Blind, chockfull of sin! Repent,")
    });
    it("should fix I've", function() {
        var testString = "Carlton Fitzpatrick is the only person I've met in cyberspace circles";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("Carlton Fitzpatrick is the only person I’ve met in cyberspace circles")
    });
});
<commit_msg>add tests for possessives<commit_after>/*eslint-env node, mocha */
var chai = require('chai');
var assert = chai.assert,
    expect = chai.expect,
    should = chai.should();

var replacements = require('../scripts/replacements.js');
var cleanup = require('../scripts/cleanup.js');

describe("common contractions", function() {
    it("should fix I'd", function() {
        var testString = "But they'd never met anyone from LoD.  Even some of the";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("But they’d never met anyone from LoD.  Even some of the")
    });
    it("should fix he'll", function() {
        var testString = "He'll shrieve my soul, he'll wash away";  // Rime of the Ancient Mariner
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("He’ll shrieve my soul, he’ll wash away")
    });
    it("should fix I'm", function() {
        var testString = "SCARED of a guy like that.  But I'm not scared.\nI'm from Chicago.  I'm gonna hunt him down.";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("SCARED of a guy like that.  But I’m not scared.\nI’m from Chicago.  I’m gonna hunt him down.")
    });
    it("should fix you're", function() {
        var testString = "They're not black or white, or Establishment or Underground,";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("They’re not black or white, or Establishment or Underground,")
    });
    it("should fix it's", function() {
        var testString = "digital underground: it's probably the most pirated piece";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("digital underground: it’s probably the most pirated piece")
    });
    it("should fix don't", function() {
        var testString = "everlasting fire... don't you feel it? Blind, chockfull of sin! Repent,";  // Conrad 'Narcissus'
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("everlasting fire... don’t you feel it? Blind, chockfull of sin! Repent,")
    });
    it("should fix I've", function() {
        var testString = "Carlton Fitzpatrick is the only person I've met in cyberspace circles";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("Carlton Fitzpatrick is the only person I’ve met in cyberspace circles")
    });
});
describe("possessives", function() {
    it("should fix singular possessive: boy's", function() {
        var testString = "So:  from the law's point of view, why risk missing anything?  Take the works.";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("So:  from the law’s point of view, why risk missing anything?  Take the works.")
    });
    it("should fix upper-case singular possessive: GRIMM'S", function() {
        var testString = "  than the wealth of all the world.” GRIMM’S TALES.";  // Youth
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("  than the wealth of all the world.” GRIMM’S TALES.")
    });
    it("should fix plural possessive: boys' ", function() {
        var testString = "and some WWII vintage blockhouses and officers' quarters.";  // Hacker Crackdown
        var tryThis = cleanup(testString);
        expect(tryThis).to.equal("and some WWII vintage blockhouses and officers’ quarters.")
    });
});
<|endoftext|>


<commit_before>#!/usr/bin/env node

process.chdir(__dirname);

var YUITest = require('yuitest'),
    path = require('path'),
    exec = require('child_process').exec;

var timer = setTimeout(function() {
    console.error('Test Timeout Exiting..');
    process.exit(1);
}, (30 * 1000)); //30 second test timout

YUITest.TestRunner.subscribe('complete', function() {
    clearTimeout(timer);
});

var Assert = YUITest.Assert;

var wrapper = path.join(__dirname, '../lib/wrapper.js');

var runTest = function(file, timeout, cb) {
    if (!cb) {
        cb = timeout;
        timeout = '';
    }
    var cmd = 'phantomjs ' + wrapper + ' ' + path.join(__dirname, file) + ' ' + timeout;
    //console.log('Executing: ', cmd);
    exec(cmd, cb);
};

var suite = new YUITest.TestSuite('Grover');

suite.add(new YUITest.TestCase({
    name: 'Good Results',
    'Check Results': function() {
        var test = this;

        runTest('./html/good.html', function(err, stdout, stderr) {
            test.resume(function() {
                var json = JSON.parse(stdout);
                Assert.areSame('Suite #1', json.name, 'Suite Name Incorrect');
                Assert.areEqual(50, json.passed, 'A test failed');
                Assert.areEqual(0, json.failed, 'A test failed');
            });
        });

        this.wait();
    }
}));

suite.add(new YUITest.TestCase({
    name: 'Failed Results',
    'Failed Tests': function() {
        var test = this;

        runTest('./html/bad.html', function(err, stdout) {
            test.resume(function() {
                var json = JSON.parse(stdout);
                Assert.areSame('Suite Bad', json.name, 'Suite Name Incorrect');
                Assert.areEqual(5, json.passed, 'A test failed');
                Assert.areEqual(5, json.failed, 'A test failed');
            });
        });

        this.wait();
    }
}));

suite.add(new YUITest.TestCase({
    name: 'Errors',
    'Should throw script error': function() {
        var test = this;

        runTest('./html/error.html', function(err, stdout) {
            test.resume(function() {
                var json = JSON.parse(stdout);
                Assert.areEqual(0, json.passed, 'A test failed');
                Assert.areEqual(1, json.failed, 'A test failed');
                Assert.isNotUndefined(json.error, 'Error message was not passed along');
            });
        });

        this.wait();
    },
    'Should Throw Timeout': function() {
        var test = this;

        runTest('./html/timeout.html', 1, function(err, stdout) {
            test.resume(function() {
                var json = JSON.parse(stdout);
                Assert.areEqual(0, json.passed, 'A test failed');
                Assert.areEqual(1, json.failed, 'A test failed');
                Assert.isNotUndefined(json.error, 'Error message was not passed along');
                Assert.areEqual('Script Timeout', json.error);
            });
        });

        this.wait();
    }
}));

YUITest.TestRunner.add(suite);

<commit_msg>Added more tests<commit_after>#!/usr/bin/env node

process.chdir(__dirname);

var YUITest = require('yuitest'),
    path = require('path'),
    exec = require('child_process').exec;

var timer = setTimeout(function() {
    console.error('Test Timeout Exiting..');
    process.exit(1);
}, (45 * 1000)); //second test timout

YUITest.TestRunner.subscribe('complete', function() {
    clearTimeout(timer);
});

var Assert = YUITest.Assert;

var wrapper = path.join(__dirname, '../lib/wrapper.js');

var runTest = function(file, timeout, cb) {
    if (!cb) {
        cb = timeout;
        timeout = '';
    }
    var cmd = 'phantomjs ' + wrapper + ' ' + path.join(__dirname, file) + ' ' + timeout;
    //console.log('Executing: ', cmd);
    exec(cmd, cb);
};

var suite = new YUITest.TestSuite('Grover');

suite.add(new YUITest.TestCase({
    name: 'Good Results',
    'Check Results': function() {
        var test = this;

        runTest('./html/good.html', function(err, stdout, stderr) {
            test.resume(function() {
                var json = JSON.parse(stdout);
                Assert.areSame('Suite #1', json.name, 'Suite Name Incorrect');
                Assert.areEqual(50, json.passed, 'A test failed');
                Assert.areEqual(0, json.failed, 'A test failed');
            });
        });

        this.wait();
    }
}));

suite.add(new YUITest.TestCase({
    name: 'Failed Results',
    'Failed Tests': function() {
        var test = this;

        runTest('./html/bad.html', function(err, stdout) {
            test.resume(function() {
                var json = JSON.parse(stdout);
                Assert.areSame('Suite Bad', json.name, 'Suite Name Incorrect');
                Assert.areEqual(5, json.passed, 'A test failed');
                Assert.areEqual(5, json.failed, 'A test failed');
            });
        });

        this.wait();
    }
}));

suite.add(new YUITest.TestCase({
    name: 'Errors',
    'Should throw script error': function() {
        var test = this;

        runTest('./html/error.html', function(err, stdout) {
            test.resume(function() {
                var json = JSON.parse(stdout);
                Assert.areEqual(0, json.passed, 'A test failed');
                Assert.areEqual(1, json.failed, 'A test failed');
                Assert.isNotUndefined(json.error, 'Error message was not passed along');
            });
        });

        this.wait();
    },
    'Should Throw Timeout': function() {
        var test = this;

        runTest('./html/timeout.html', 1, function(err, stdout) {
            test.resume(function() {
                var json = JSON.parse(stdout);
                Assert.areEqual(0, json.passed, 'A test failed');
                Assert.areEqual(1, json.failed, 'A test failed');
                Assert.isNotUndefined(json.error, 'Error message was not passed along');
                Assert.areEqual('Script Timeout', json.error);
            });
        });

        this.wait();
    }
}));

var parse = require(path.join(__dirname, '../lib/options')).parse;

suite.add(new YUITest.TestCase({
    name: 'Options Tests',
    'check timeout number': function() {
        var opts = parse(['-t', '3']);
        Assert.areEqual(3, opts.timeout, 'Failed to set number timeout');

        opts = parse(['--timeout', '3']);
        Assert.areEqual(3, opts.timeout, 'Failed to set number timeout');
    },
    'check timeout -1': function() {
        var opts = parse(['-t', '-1']);
        Assert.isNull(opts.timeout, 'Failed to set null timeout');

        opts = parse(['--timeout', '-1']);
        Assert.isNull(opts.timeout, 'Failed to set null timeout');
    },
    'check timeout string': function() {
        var opts = parse(['-t', 'foobar']);
        Assert.isUndefined(opts.timeout, 'Failed to set null timeout');

        opts = parse(['--timeout', 'foobar']);
        Assert.isUndefined(opts.timeout, 'Failed to set null timeout');
    },
    'check booleans': function() {
        var opts = parse(['-s', '-q', '-f']);
        Assert.isTrue(opts.silent, 'Failed to set silent');
        Assert.isTrue(opts.quiet, 'Failed to set quiet');
        Assert.isTrue(opts.exitOnFail, 'Failed to set exitOnFail');

        opts = parse(['--quiet', '--silent', '--fail']);
        Assert.isTrue(opts.silent, 'Failed to set silent');
        Assert.isTrue(opts.quiet, 'Failed to set quiet');
        Assert.isTrue(opts.exitOnFail, 'Failed to set exitOnFail');
    }
}));

YUITest.TestRunner.add(suite);

<|endoftext|>


<commit_before>const R = require("ramda");
const M = require("monet");
const E = M.Either;
const utils = require("../lib/utils.js");
const assert = require("chai").assert;
const fs = require("fs");
const parseString = require('xml2json-light').xml2json;

describe("Utils test", function() {
    const schemaString = fs.readFileSync("./tests/test_schema.xsd").toString();
    const xmlString = fs.readFileSync("./tests/test.xml").toString();
    const incorrectXmlString = fs.readFileSync("./tests/incorrect_xml.xml").toString();

    it("Schema valid Xml should return a right with the xml string", function() {
        assert.deepEqual(utils.validateXML(schemaString, xmlString), E.Right(xmlString));

    });

    it("Schema invalid Xml should return a left", function() {
        assert.equal(utils.validateXML(schemaString, incorrectXmlString).isLeft(), true);

    });

    it("Value-valid should return a right given custom validation function", function() {
        const lensPath = R.lensPath(['shows', 'show'])
        const lens = R.lensPath(['type']);
        const validation = function(y) {
            return 3 == y.filter(function(x) {
                return x == "1"
            }).length;
        };

        const x = parseString(xmlString)
        const view = R.view(lensPath, x);
        const output = utils.validateAttributeValue(view, lens, validation, "error msg");
        assert.deepEqual(output, E.Right(view));

    });

    it("Value-invalid should return a left given custom validation function", function() {
        const lensPath = R.lensPath(['shows', 'show'])
        const lens = R.lensPath(['type']);
        const validation = function(y) {
            return 5 == y.filter(function(x) {
                return x == "1"
            }).length;
        };

        const x = parseString(xmlString)
        const view = R.view(lensPath, x);
        const output = utils.validateAttributeValue(view, lens, validation, "error msg");
        assert.deepEqual(output, E.Left("error msg"));

    });

});
<commit_msg>Added tests for the busines logic specific function<commit_after>const R = require("ramda");
const M = require("monet");
const E = M.Either;
const utils = require("../lib/utils.js");
const assert = require("chai").assert;
const fs = require("fs");
const parseString = require('xml2json-light').xml2json;

describe("Utils test", function() {
    const schemaString = fs.readFileSync("./tests/test_schema.xsd").toString();
    const xmlString = fs.readFileSync("./tests/test.xml").toString();
    const incorrectXmlString = fs.readFileSync("./tests/incorrect_xml.xml").toString();

    it("Schema valid Xml should return a right with the xml string", function() {
        assert.deepEqual(utils.validateXML(schemaString, xmlString), E.Right(xmlString));

    });

    it("Schema invalid Xml should return a left", function() {
        assert.equal(utils.validateXML(schemaString, incorrectXmlString).isLeft(), true);

    });

    it("Value-valid should return a right given custom validation function", function() {
        const lensPath = R.lensPath(['shows', 'show'])
        const lens = R.lensPath(['type']);
        const validation = function(y) {
            return 3 == y.filter(function(x) {
                return x == "1"
            }).length;
        };

        const x = parseString(xmlString)
        const view = R.view(lensPath, x);
        const output = utils.validateAttributeValue(view, lens, validation, "error msg");
        assert.deepEqual(output, E.Right(view));

    });

    it("Value-invalid should return a left given custom validation function", function() {
        const lensPath = R.lensPath(['shows', 'show'])
        const lens = R.lensPath(['type']);
        const validation = function(y) {
            return 5 == y.filter(function(x) {
                return x == "1"
            }).length;
        };

        const x = parseString(xmlString)
        const view = R.view(lensPath, x);
        const output = utils.validateAttributeValue(view, lens, validation, "error msg");
        assert.deepEqual(output, E.Left("error msg"));

    });

    describe("Business logic specific validation function tests", function() {
        const input = ["1", "2", "2", "3", "3", "4"];
        it("it should not exceed a count, should return true", function() {
            assert.equal(utils.validateJson(input, 3), true);
        })

        it("it should not exceed a count, should return false", function() {
            assert.equal(utils.validateJson(input, 1), false);
        })

    });

});
<|endoftext|>


<commit_before>"use strict";
const { expect } = require('chai');

describe('test suite', () => {
  it('true should be true', () => {
    expect(true).to.be.true;
  });
});
<commit_msg>comparing the real cal to my cal in a test<commit_after>"use strict";
const { expect } = require('chai');
const { execSync } = require('child_process');

describe('cal', () => {
  it('should display the current month', () => {
    const goal = execSync('cal').toString();
    const ourOutput = execSync('./cal.js').toString();

    expect(ourOutput).to.equal(goal);
  });
});
<|endoftext|>


<commit_before>"use strict";

const DESCRIPTION = "Run AVIM string manipulation tests";
const USAGE = "js24 -b -s test.js";
if (scriptArgs.length && ["-?", "--help"].indexOf(scriptArgs[0]) >= 0) {
	print(DESCRIPTION);
	print("Usage: " + USAGE);
	quit();
}

load("assert.js");
load("transformer.js");

let prefs = {
	method: 3 /* VIQR */,
	ckSpell: true,
	informal: false,
	oldAccent: true,
};

okApplyKey(prefs, "bo", "^", "bô");
okApplyKey(prefs, "bô", ".", "bộ");
okApplyKey(prefs, "gõ", "-", "go");

okApplyKey(prefs, "dt", "d", "dtd");	// d44df2bae6c2
okApplyKey(prefs, "zi", "`", "zi`");	// cdf616a8ce81
okApplyKey(prefs, "qi", "'", "qi'");	// Mudim #16
okApplyKey(prefs, "ka", "'", "ká");	// Mudim #16, 7459b5d33ee8, 91e3cca3ebdb
okApplyKey(prefs, "ko", "'", "kó");	// Mudim #16, 7459b5d33ee8, 91e3cca3ebdb
okApplyKey(prefs, "ku", "'", "kú");	// Mudim #16, 7459b5d33ee8, 91e3cca3ebdb
okApplyKey(prefs, "XOA", "'", "XÓA");	// 91e3cca3ebdb
okApplyKey(prefs, "gin", "`", "gìn");	// 91e3cca3ebdb, c927d74748fa
okApplyKey(prefs, "ô", "^", "o^");	// 441e8cf7aacd
okApplyKey(prefs, "Ng", "~", "Ng~");	// ce59e67eadca

okApplyKey(prefs, "trắng", "(", "tráng(");
okApplyKey(prefs, "bế", "^", "bé^");	// #13
okApplyKey(prefs, "bố", "^", "bó^");	// #13
//okApplyKey(prefs, "kilômet", "'", "kilômét");	// #14
okApplyKey(prefs, "cúu", "+", "cứu");	// #70

prefs = {
	method: 3 /* VIQR */,
	ckSpell: false,
	informal: false,
	oldAccent: true,
};

okApplyKey(prefs, "Ng", "~", "Ng̃");
okApplyKey(prefs, "ng", "~", "ng̃");	// ce59e67eadca
//okApplyKey(prefs, "Ng̃", "u", "Ngũ");	// #12

let prefs = {
	method: 1 /* Telex */,
	ckSpell: true,
	informal: false,
	oldAccent: true,
};

okApplyKey(prefs, "bế", "e", "bée");	// #13

let status = assert.errors.length ? 1 : 0;
assert.flush();
quit(status);
<commit_msg>Test for bugs found in other Vietnamese IMEs<commit_after>"use strict";

const DESCRIPTION = "Run AVIM string manipulation tests";
const USAGE = "js24 -b -s test.js";
if (scriptArgs.length && ["-?", "--help"].indexOf(scriptArgs[0]) >= 0) {
	print(DESCRIPTION);
	print("Usage: " + USAGE);
	quit();
}

load("assert.js");
load("transformer.js");

let prefs = {
	method: 3 /* VIQR */,
	ckSpell: true,
	informal: false,
	oldAccent: true,
};

okApplyKey(prefs, "bo", "^", "bô");
okApplyKey(prefs, "bô", ".", "bộ");
okApplyKey(prefs, "gõ", "-", "go");

okApplyKey(prefs, "dt", "d", "dtd");	// d44df2bae6c2
okApplyKey(prefs, "zi", "`", "zi`");	// cdf616a8ce81
okApplyKey(prefs, "qi", "'", "qi'");	// Mudim #16
okApplyKey(prefs, "ka", "'", "ká");	// Mudim #16, 7459b5d33ee8, 91e3cca3ebdb
okApplyKey(prefs, "ko", "'", "kó");	// Mudim #16, 7459b5d33ee8, 91e3cca3ebdb
okApplyKey(prefs, "ku", "'", "kú");	// Mudim #16, 7459b5d33ee8, 91e3cca3ebdb
okApplyKey(prefs, "XOA", "'", "XÓA");	// 91e3cca3ebdb
okApplyKey(prefs, "gin", "`", "gìn");	// 91e3cca3ebdb, c927d74748fa
okApplyKey(prefs, "ô", "^", "o^");	// 441e8cf7aacd
okApplyKey(prefs, "Ng", "~", "Ng~");	// ce59e67eadca

okApplyKey(prefs, "trắng", "(", "tráng(");
okApplyKey(prefs, "bế", "^", "bé^");	// #13
okApplyKey(prefs, "bố", "^", "bó^");	// #13
//okApplyKey(prefs, "kilômet", "'", "kilômét");	// #14
okApplyKey(prefs, "cúu", "+", "cứu");	// #70

okApplyKey(prefs, "tong", "+", "tơng");	// UniKey #32
okApplyKey(prefs, "Đ", "D", "DD");	// UniKey #38

prefs = {
	method: 3 /* VIQR */,
	ckSpell: false,
	informal: false,
	oldAccent: true,
};

okApplyKey(prefs, "Ng", "~", "Ng̃");
okApplyKey(prefs, "ng", "~", "ng̃");	// ce59e67eadca
//okApplyKey(prefs, "Ng̃", "u", "Ngũ");	// #12

let prefs = {
	method: 1 /* Telex */,
	ckSpell: true,
	informal: false,
	oldAccent: false,
};

okApplyKey(prefs, "bế", "e", "bée");	// #13

okApplyKey(prefs, "cy", "s", "cys");	// Mudim #16
//okApplyKey(prefs, "ka", "a", "kaa");	// Mudim #16
//okApplyKey(prefs, "ko", "o", "koo");	// Mudim #16
//okApplyKey(prefs, "ko", "w", "kow");	// Mudim #16
//okApplyKey(prefs, "ku", "w", "kuw");	// Mudim #16
okApplyKey(prefs, "ty", "r", "tỷ");	// Mudim #16
okApplyKey(prefs, "coa", "f", "coaf");	// Mudim #16
okApplyKey(prefs, "coe", "f", "coef");	// Mudim #16
okApplyKey(prefs, "cuy", "f", "cuyf");	// Mudim #16
okApplyKey(prefs, "ty", "r", "tỷ");	// Mudim #16
okApplyKey(prefs, "kiu", "s", "kíu");	// UniKey #23
okApplyKey(prefs, "ki", "s", "kí");	// UniKey #23

let status = assert.errors.length ? 1 : 0;
assert.flush();
quit(status);
<|endoftext|>


<commit_before>describe('Check easyCanvas Object', function() {
    var test = easyCanvas.create('.test', '2d');
    it('Should return an Object', function() {
        expect(typeof test).toBe('object');
    });
});<commit_msg>'testing stuff<commit_after>describe('Check easyCanvas Object', function() {
    var t = document.createElement('canvas');
    t.classList.add('test');
    document.body.appendChild(t);
    var test = easyCanvas.create('.test', '2d');
    it('Should return an Object', function() {
        expect(typeof test).toBe('object');
    });
});<|endoftext|>


<commit_before>#!/usr/bin/env node
 //here are some usefull test

require('../l-string');

/*
console.log("leo".isUpper())
console.log("leo".isLower())
console.log("leo".isAlpha())
console.log("leo".isDigit())
console.log("leo".isAlphanumeric())
console.log("leo".isUpper())
console.log("leo".isEmpty())
console.log("leo".isSpace())
console.log("leo".isSubString("le"))
console.log("leo".multiply(2))
console.log("leo".rSlice(2, 4))
console.log("leo".dummyCount("e"))
console.log("leo".capitalize())
console.log("leo".getCharPosition("e"))
console.log("leo".reverse())
console.log("leo".title())
console.log("leo".lSplit("e", 1))
console.log("leo".rSplit("o", 1))
console.log("leo".startsWith("o"))
console.log("leo".endsWith("o"))
console.log("leo".startsWith("o"))
console.log("leo".swapCase())
console.log("leo   ".trim())
console.log("leo   ".trimPrefix("eo"))
console.log("leo".rConCat("a"))
console.log("leo   ".lConCat("a"))
console.log("leo   ".lReplace("eo", "1231"))
console.log("leo   ".rReplace("eo", "1231"))
console.log("leo   ".join("-"))
console.log("leo   ".toCharArray())
console.log("leo   ".insert("eo", 2))
console.log("leo   ".remove("eo"))
console.log("leo   ".center(2, "-"))
console.log("leo   ".lJust(2, "-"))
console.log("leo   ".rJust(2, "-"))
console.log("leo".slugify())
console.log("leoanrdo esparis, leonardo esparis".smartCount("leo", "l1", 20))
console.log("leoanrdo esparis, leonardo esparis".smartCount("leo", "l1", "1o"))

console.log("
\"\'<>&leonardo
".escape())
console.log("
leo
".removeTag())
var a = '

'
var b = a.addAttr2Tag("h13", "data-city", "algo")
var c = b.addStyle2Tag("h12", [['margin', '0 0 0 0'], ['color', 'red']])
var d = c.addClassName2Tag("h11", "leonardo")
console.log(d.addIdName2Tag("h12", "pepe").addAttr2Tag("h13", "data-city2", "algo2").addIdName2Tag("h12", "pep22e"))
*/<commit_msg>new example added<commit_after>#!/usr/bin/env node
 //here are some usefull test

require('../l-string');

console.log("leo".isUpper())
console.log("leo".isLower())
console.log("leo".isAlpha())
console.log("leo".isDigit())
console.log("leo".isAlphanumeric())
console.log("leo".isUpper())
console.log("leo".isEmpty())
console.log("leo".isSpace())
console.log("leo".isSubString("le"))
console.log("leo".multiply(2))
console.log("leo".rSlice(2, 4))
console.log("leo".dummyCount("e"))
console.log("0".ord())
console.log("leo".capitalize())
console.log("leo".getCharPosition("e"))
console.log("leo".reverse())
console.log("leo".title())
console.log("leo".lSplit("e", 1))
console.log("leo".rSplit("o", 1))
console.log("leo".startsWith("o"))
console.log("leo".endsWith("o"))
console.log("leo".startsWith("o"))
console.log("leo".swapCase())
console.log("leo   ".trim())
console.log("leo   ".trimPrefix("eo"))
console.log("leo".rConCat("a"))
console.log("leo   ".lConCat("a"))
console.log("leo   ".lReplace("eo", "1231"))
console.log("leo   ".rReplace("eo", "1231"))
console.log("leo   ".join("-"))
console.log("leo   ".toCharArray())
console.log("leo   ".insert("eo", 2))
console.log("leo   ".remove("eo"))
console.log("leo   ".center(2, "-"))
console.log("leo   ".lJust(2, "-"))
console.log("leo   ".rJust(2, "-"))
console.log("leo".slugify())
console.log("leoanrdo esparis, leonardo esparis".smartCount("leo", "l1", 20))
console.log("leoanrdo esparis, leonardo esparis".smartCount("leo", "l1", "1o"))

console.log("
\"\'<>&leonardo
".escape())
console.log("
leo
".removeTag())
var a = '

'
var b = a.addAttr2Tag("h13", "data-city", "algo")
var c = b.addStyle2Tag("h12", [['margin', '0 0 0 0'], ['color', 'red']])
var d = c.addClassName2Tag("h11", "leonardo")
console.log(d.addIdName2Tag("h12", "pepe").addAttr2Tag("h13", "data-city2", "algo2").addIdName2Tag("h12", "pep22e"))

<|endoftext|>


<commit_before>var Mock = require('../lib/akeley').Mock;

exports.test_object_spec = {
    setUp: function(cb) { cb() },
    test_combined: function(test) {
        var cat = {
            name: 'unix',
            vitals: {
                age: 6,
                colours: ['orange', 'black', 'brown'],
            },
            speak: function() { return "my name is " + this.name },
            abilities: {
                sit: function() { return "sat" },
                sleep: function() { return "zzz" }
            },

        };
        var mock_cat = new Mock(cat);
        test.equal(mock_cat.name, 'unix', 'name is set');
        test.equal(mock_cat.vitals.age, 6, 'age is set');
        test.deepEqual(mock_cat.vitals.colours, ['orange', 'black', 'brown'], 'colours is set');
        test.equal(mock_cat.speak.calls, 0, 'function mocked');
        test.equal(mock_cat.abilities.sit.calls, 0, 'function mocked');
        test.equal(mock_cat.abilities.sleep.calls, 0, 'function mocked');

        test.done();
    }
};
<commit_msg>finish spec tests, stub MockFunction tests<commit_after>var Mock = require('../lib/akeley').Mock;

exports.test_object_spec = {
    setUp: function(cb) { cb() },
    test_toplevel: function(test) {
        var cat = {
            name: 'unix',
            age: 6
        };
        var mock_cat = new Mock(cat);
        test.equal(mock_cat.name, 'unix', 'name set');
        test.equal(mock_cat.age, 6, 'age set');
        test.done();
    },
    test_nested: function(test) {
        var cat = {
            vitals: {
                age: 6,
                weight: 17,
                appearance: {
                    legs: 4,
                    colours: ['orange', 'black', 'brown']
                }
            }
        };
        var mock_cat = new Mock(cat);
        test.equal(mock_cat.vitals.age, 6, 'age set');
        test.equal(mock_cat.vitals.weight, 17, 'weight set');
        test.equal(mock_cat.vitals.appearance.legs, 4, 'legs set');
        test.deepEqual(mock_cat.vitals.appearance.colours, ['orange', 'black', 'brown'], 'colours set');
        test.done()

    },
    test_functions: function(test) {
        var cat = {
            speak: function() { return "my name is " + this.name },
            abilities: {
                sit: function() { return "sat" },
                sleep: function() { return "zzz" }
            }
        };
        var mock_cat = new Mock(cat);
        test.equal(mock_cat.speak.called, false, 'function wrapped');
        test.equal(mock_cat.abilities.sit.called, false, 'function wrapped');
        test.equal(mock_cat.abilities.sleep.called, false , 'function wrapped');
        test.done();
    },
    test_combined: function(test) {
        var cat = {
            name: 'unix',
            vitals: {
                age: 6,
                colours: ['orange', 'black', 'brown'],
            },
            speak: function() { return "my name is " + this.name },
            abilities: {
                sit: function() { return "sat" },
                sleep: function() { return "zzz" }
            }
        };
        var mock_cat = new Mock(cat);
        test.equal(mock_cat.name, 'unix', 'name is set');
        test.equal(mock_cat.vitals.age, 6, 'age is set');
        test.deepEqual(mock_cat.vitals.colours, ['orange', 'black', 'brown'], 'colours is set');
        test.equal(mock_cat.speak.calls, 0, 'function mocked');
        test.equal(mock_cat.abilities.sit.calls, 0, 'function mocked');
        test.equal(mock_cat.abilities.sleep.calls, 0, 'function mocked');

        test.done();
    }
};

exports.test_MockFunction = {
    setUp: function(cb) {
        this.f = function() { return "hi" };
        this.mock_f = new Mock.MockFunction(this.f);
        cb();
    },
    test_passthrough: function(test) {
        test.done();
    },
    test_noop: function(test) {
        test.done();
    },
    test_call_count: function(test) {
        test.done();
    },
    test_args: function(test) {
        test.done();
    },
    test_called: function(test) {
        test.done();
    }
};
<|endoftext|>


<commit_before>var rjs = require('roblox-js');
var request = require('request');
var jar = request.jar();

var opt2 = {
    //jar: jar,
    success: console.log,
    failure: function(err) {
        console.log('Fail: ' + err);
    },
    always: function() {
        console.log('Done');
    }
};

var sopt = {
    group: 147864,
    roleset: 791521,
    target: 21303105,
    //jar: jar,
    success: function() {
        console.log('woot');
    },
    failure: function(err) {
        console.log('Fail set: ' + err);
    },
    always: function() {
        console.log('Done set');
    }
};

var mopt = {
  recipient: 21303049,
  subject: 'Test',
  body: Date.now().toString()
};

var options = {
    username: '',
    password: '',
    //jar: jar,
    success: function() {
        console.log('Logged in');
        rjs.getCurrentUser(opt2);
        //rjs.getToken('http://www.roblox.com/messages/send',jar,console.log,console.log);

        //rjs.message(21303049,'Test',Date.now().toString(),undefined,jar,console.log,console.log);
        rjs.message(mopt);

        //rjs.setRank(sopt);
        //rjs.setRank(sopt.group,sopt.target,sopt.roleset,undefined,sopt.jar,sopt.success,sopt.failure,sopt.always);
    },
    failure: function(err) {
        console.log('Fail: ' + err);
    },
    always: function() {
        console.log('Done');
    }
};

rjs.login(options);
//rjs.login(options.username,options.password,options.jar,options.success,options.failure,options.always);
<commit_msg>Delete test.js<commit_after><|endoftext|>