<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Roblox Scripts</title><generator>teletype.in</generator><description><![CDATA[Roblox Scripts]]></description><link>https://teletype.in/@robloxscripts?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=robloxscripts</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/robloxscripts?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/robloxscripts?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 30 Apr 2026 02:42:43 GMT</pubDate><lastBuildDate>Thu, 30 Apr 2026 02:42:43 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@robloxscripts/breakin2story</guid><link>https://teletype.in/@robloxscripts/breakin2story?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=robloxscripts</link><comments>https://teletype.in/@robloxscripts/breakin2story?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=robloxscripts#comments</comments><dc:creator>robloxscripts</dc:creator><title>Скрипт на Break In 2 (Story)</title><pubDate>Sat, 22 Feb 2025 20:46:05 GMT</pubDate><description><![CDATA[<img src="https://img1.teletype.in/files/c8/77/c8774ee9-7ea3-45c9-850b-e3ce11747854.png"></img>Получить скрипт можно бесплатно на сайте https://itzperson.ru/scripts/break-in-2-story/.]]></description><content:encoded><![CDATA[
  <figure id="qWGE" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c8/77/c8774ee9-7ea3-45c9-850b-e3ce11747854.png" width="587" />
    <figcaption>Break In 2 (Story)</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="nbTF"><strong>Получить скрипт можно бесплатно на сайте <a href="https://itzperson.ru/scripts/break-in-2-story/" target="_blank">https://itzperson.ru/scripts/break-in-2-story/</a>.</strong></p>
  </section>
  <ul id="bWi0"></ul>
  <p id="l3Zc">ОГРОМНЫЙ ФУНКЦИОНАЛ СКРИПТА</p>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="rHxC">😍 ОГРОМНЫЙ ФУНКЦИОНАЛ СКРИПТА 😋</p>
    <ul id="74di">
      <li id="57Qd">Functions:</li>
      <li id="5Mdx">Game</li>
      <ul id="X2v4">
        <li id="aJwN">Accept Uncle Pete’s Quest</li>
        <li id="zlnZ">Unlock Custom NPC</li>
        <li id="b6S4">Unlock All NPCs</li>
        <li id="tZlg">Open Secret Door</li>
      </ul>
      <li id="mQOc">World</li>
      <ul id="1hwx">
        <li id="kOLu">Disable Ice Slip</li>
        <li id="tADp">Fullbright</li>
        <li id="RMOr">Collect Outside Foods</li>
        <li id="nFxv">Global Teleport</li>
        <li id="VwSH">Spoof Indoors</li>
        <li id="jUbv">Teleport to Player</li>
      </ul>
      <li id="SIg7">Player</li>
      <ul id="kSbt">
        <li id="du1T">Heal Player</li>
        <li id="VvIk">Godmode</li>
        <li id="n5JL">Upgrade Duff of Choice</li>
        <li id="UI0u">Max Buffs</li>
        <li id="A3dP">Visually Show Speed</li>
      </ul>
      <li id="XGiD">Combat</li>
      <ul id="NDwF">
        <li id="OzpC">Kill Nearby Enemies</li>
        <li id="bW6G">Kill Aura</li>
        <li id="qqKG">Kill Bosses</li>
        <li id="rN4C">Kill Pizza Boss</li>
      </ul>
      <li id="nMY0">Utilities</li>
      <ul id="bn4c">
        <li id="ctsU">Give Best Weapon</li>
        <li id="h57m">Equip Armor</li>
        <li id="AkOX">Heal Everyone</li>
        <li id="Gfos">Infinite Golden Pizza</li>
        <li id="03Db">Stack on Foods</li>
      </ul>
      <li id="lshx">Troll</li>
      <ul id="8BAP">
        <li id="PdmY">Spin Bad Guys</li>
        <li id="DlEQ">Kick Player</li>
        <li id="qLg1">Kick Everyone</li>
        <li id="2vdH">Delete Entire Map</li>
        <li id="ZTzS">Delete Item</li>
      </ul>
      <li id="UC2Y">Areas</li>
      <ul id="XqM7">
        <li id="p6a9">Squash Player</li>
        <li id="4XpC">Slip on Ice</li>
        <li id="4P31">Give Area Item.</li>
      </ul>
    </ul>
  </section>
  <p id="qPVQ"></p>
  <ul id="9hUo"></ul>
  <p id="ILud">Приготовься к новым приключениям в <a href="https://www.roblox.com/games/13864661000" target="_blank">Break In 2 (Story)</a> с уникальны<a href="https://itzperson.ru/scripts/break-in-2-story/" target="_blank">м скри</a>птом от популярного разработчика Starry! <a href="https://itzperson.ru/scripts/break-in-2-story/" target="_blank">ItzPerson</a> предлагает мощное решение, которое изменит твой подход к игре, ускорит прохождение и откроет новые, скрытые возможности. Забудь о монотонных действиях и бесконечных поисках ключей! Этот скрипт позволит тебе:🚀 Перемещаться быстрее – свободно исследуй карту, минуя препятствия и быстро достигая нужных точек. Проводя меньше времени на пути, ты сможешь сосредоточиться на увлекательных аспектах игры!🔍 Исследовать секретные локации – загляни в потаенные уголки карты и открой скрытые комнаты и тайники. В них могут быть ценные ресурсы, делающие твоё приключение ещё более захватывающим.🛠️ Мгновенно взаимодействовать с объектами – подними предметы, открывай двери и решай головоломки без задержек. С этим скриптом процесс игры станет легче и комфортнее!💡 Получить преимущество в сложных ситуациях – забудь о безвыходных ситуациях! Легко обходи препятствия и наслаждайся игрой, не сталкиваясь с ограничениями.⚙️ Настроить под себя – благодаря гибким параметрам ты сможешь адаптировать скрипт под свои предпочтения, что сделает игровой процесс ещё более приятным.</p>
  <p id="lVMv"></p>
  <p id="Bacv"></p>
  <p id="TEGl"></p>
  <p id="r5OR">мощное решение, которое изменит твой подход к <a href="https://www.roblox.com/games/13864661000" target="_blank">игре</a>, у<a href="https://itzperson.ru/scripts/break-in-2-story/" target="_blank">скор</a>ит прохождение и откроет новые, скрытые возможности. </p>
  <p id="dNgF">Забудь о монотонных действиях и бесконечных поисках ключей! Этот скрипт позволит тебе:</p>
  <p id="ij5t">🚀 Перемещаться быстрее – свободно исследуй карту, минуя препятствия и быстро достигая нужных точек. Проводя меньше времени на пути, ты сможешь сосредоточиться на увлекательных аспектах игры!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@robloxscripts/doors</guid><link>https://teletype.in/@robloxscripts/doors?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=robloxscripts</link><comments>https://teletype.in/@robloxscripts/doors?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=robloxscripts#comments</comments><dc:creator>robloxscripts</dc:creator><title>ТОПОВЫЙ СКРИПТ НА DOORS</title><pubDate>Tue, 18 Feb 2025 20:14:49 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/9d/49/9d49e23a-d0e1-4c32-a6cd-e592a80662e8.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/f9/d3/f9d3a753-73f7-421d-b7e1-b4bf71759e54.png"></img>Функции скрипта:]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="aDB2"><strong><em>Функции скрипта:</em></strong></p>
    <ul id="3SI3">
      <li id="f0Eh">Seek Gun</li>
      <li id="K8yJ">Crucifix On Anything (press q on keyboard and mouse click to use)</li>
      <li id="DZoq">Black Hole</li>
      <li id="7CmL">Starlight Bottle</li>
      <li id="XCHN">Moonlight Bottle</li>
      <li id="zBzV">Spiral Light Bottle</li>
      <li id="U6Tl">Golden Flashlight</li>
      <li id="ASvc">Purple Flashlight</li>
      <li id="7i8V">Guilding Candle</li>
      <li id="uFDO">И ещё очень много полезных функций</li>
    </ul>
  </section>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="UCGd">СКРИПТ:</p>
    <p id="dYAV">Получить скрипт можно на этом сайте: <a href="https://itzperson.ru/scripts/doors-5/" target="_blank">https://itzperson.ru/scripts/doors-5/</a></p>
    <p id="eenU">PS: не реклама, но там есть куча скриптов для Roblox</p>
  </section>
  <p id="8uNj">▎Откройте новые горизонты в <a href="https://www.roblox.com/games/6516141723" target="_blank">Roblox</a> <a href="https://www.roblox.com/games/6516141723" target="_blank">DOORS</a> с эксклюзивным скриптом от ItzPerson!</p>
  <p id="08aF">Готовы ли вы столкнуться с кошмарами Roblox <a href="https://www.roblox.com/games/6516141723" target="_blank">DOORS</a>? Теперь у вас есть уникальное преимущество, которое сделает ваше приключение более увлекательным и безопасным! Познакомьтесь с инновационным скриптом от ItzPerson, разработанным талантливым Kodbol – мастером создания скриптов для <a href="https://www.roblox.com/games/6516141723" target="_blank">Roblox</a>. Этот инструмент позволит вам исследовать загадочные коридоры без лишних трудностей и страха.</p>
  <p id="ifnE">▎Что может предложить этот скрипт?</p>
  <p id="Oc0Z">🚀 Мгновенное перемещение</p>
  <p id="usZG">Забудьте о медленных и пугающих прогулках по темным комнатам! С помощью этого скрипта вы сможете мгновенно находить выходы и ускользать от угроз. Ваше время на исследование станет более продуктивным, а страх перед неожиданными встречами с монстрами уйдет в прошлое.</p>
  <p id="t4Bf">👀 Рентген-зрение</p>
  <p id="JDMB">Теперь вы сможете заглядывать сквозь стены и двери, заранее зная, что вас ждет за углом. Это значит, что больше не будет неожиданных встреч с ужасными существами, которые могут испортить ваше настроение и игру.</p>
  <p id="b2BT">⚠️ Игнорирование ловушек</p>
  <p id="sfLS">Скрипт поможет вам обойти самые коварные ловушки, позволяя сосредоточиться на исследовании окружающего мира, а не на выживании. Вы сможете наслаждаться игрой без лишних стрессов!</p>
  <p id="9Rk4">💡 Подсказки и важная информация</p>
  <p id="Hy1q">Получайте полезные подсказки о расположении комнат, монстров и головоломок. Это поможет вам действовать максимально эффективно и избегать ненужных проблем.</p>
  <p id="7Y6V">🤖 Автоматизация рутинных действий</p>
  <p id="sfUi">Скрипт автоматически собирает предметы и выполняет базовые действия, что позволяет вам полностью сосредоточиться на игре и получать удовольствие от процесса.</p>
  <p id="rgQf">⚙️ Полная персонализация</p>
  <p id="Vr3V">Настройте скрипт так, чтобы он идеально соответствовал вашему стилю игры. Выберите те функции, которые вам наиболее интересны, и создайте уникальный игровой опыт.</p>
  <p id="xDtq">▎Почему стоит попробовать этот скрипт?</p>
  <p id="DBVA">Этот инструмент был создан Kodbol – известным автором на платформе ScriptBlox, который зарекомендовал себя как надежный разработчик скриптов для Roblox. Скрипт стабилен, безопасен и протестирован, так что вы можете наслаждаться игрой без каких-либо опасений.</p>
  <p id="dwg1">▎Что входит в комплект?</p>
  <p id="Erhz">✔️ Скрипт – проверенный и безопасный, готовый к использованию (вы можете скопировать его выше).</p>
  <p id="sBaj">✔️ Техническая поддержка – если у вас возникнут вопросы или понадобится помощь, мы всегда готовы помочь вам в нашем Telegram-чате!</p>
  <p id="F0O4">Не упустите возможность сделать свое прохождение в <a href="https://www.roblox.com/games/6516141723" target="_blank">Roblox</a> <a href="https://www.roblox.com/games/6516141723" target="_blank">DOORS</a> более интересным и комфортным! Присоединяйтесь к тысячам игроков, которые уже оценили преимущества этого уникального инструмента! 🚪🔦</p>
  <p id="HTI9">Теги: roblox scripts, doors script, hack roblox.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@robloxscripts/unc</guid><link>https://teletype.in/@robloxscripts/unc?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=robloxscripts</link><comments>https://teletype.in/@robloxscripts/unc?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=robloxscripts#comments</comments><dc:creator>robloxscripts</dc:creator><title>UNC Test</title><pubDate>Fri, 17 May 2024 21:05:45 GMT</pubDate><description><![CDATA[<img src="https://img2.teletype.in/files/d7/29/d7295b5c-9b51-4c27-bb6e-3c88ccc1e3a8.png"></img>]]></description><content:encoded><![CDATA[
  <ul id="a5pp">
    <li id="5U91">The Updated UNC Test, Since the old UNC test checks for getfenv(0) and not getgenv(), I&#x27;ve updated it to check for getgenv() functions.</li>
  </ul>
  <p id="grLI"></p>
  <figure id="tMdM" class="m_original">
    <img src="https://img2.teletype.in/files/d7/29/d7295b5c-9b51-4c27-bb6e-3c88ccc1e3a8.png" width="480" />
  </figure>
  <pre id="RQ62" data-lang="makefile">local passes, fails, undefined = 0, 0, 0
local running = 0

getGlobal = getgenv

local function test(name, aliases, callback)
	running = running + 1

	task.spawn(function()
		if not callback then
			print(&quot;⏺️ &quot; .. name)
		elseif not getGlobal(name) then
			fails = fails + 1
			warn(&quot;⛔ &quot; .. name)
		else
			local success, message = pcall(callback)
	        name = tostring(name)
			message = tostring(message)
			if success then
				passes = passes + 1
				print(&quot;✅ &quot; .. tostring(name) .. (tostring(message) and &quot; • &quot; .. tostring(message) or &quot;&quot;))
			else
				fails = fails + 1
				warn(&quot;⛔ &quot; .. name .. &quot; failed: &quot; .. message)
			end
		end
	
		local undefinedAliases = {}
	
		for _, alias in ipairs(aliases) do
			if getGlobal(alias) == nil then
				table.insert(undefinedAliases, alias)
			end
		end
	
		if #undefinedAliases &gt; 0 then
			undefined = undefined + 1
			warn(&quot;⚠️ &quot; .. table.concat(undefinedAliases, &quot;, &quot;))
		end

		running = running - 1
	end)
end

-- Header and summary

print(&quot;\n&quot;)

print(&quot;UNC Environment Check&quot;)
print(&quot;✅ - Pass, ⛔ - Fail, ⏺️ - No test, ⚠️ - Missing aliases\n&quot;)

task.defer(function()
	repeat task.wait() until running == 0

	local rate = math.round(passes / (passes + fails) * 100)
	local outOf = passes .. &quot; out of &quot; .. (passes + fails)

	print(&quot;\n&quot;)

	print(&quot;UNC Summary&quot;)
	print(&quot;✅ Tested with a &quot; .. rate .. &quot;% success rate (&quot; .. outOf .. &quot;)&quot;)
	print(&quot;⛔ &quot; .. fails .. &quot; tests failed&quot;)
	print(&quot;⚠️ &quot; .. undefined .. &quot; globals are missing aliases&quot;)
end)

-- Cache

test(&quot;cache.invalidate&quot;, {}, function()
	local container = Instance.new(&quot;Folder&quot;)
	local part = Instance.new(&quot;Part&quot;, container)
	cache.invalidate(container:FindFirstChild(&quot;Part&quot;))
	assert(part ~= container:FindFirstChild(&quot;Part&quot;), &quot;Reference &#x60;part&#x60; could not be invalidated&quot;)
end)

test(&quot;cache.iscached&quot;, {}, function()
	local part = Instance.new(&quot;Part&quot;)
	assert(cache.iscached(part), &quot;Part should be cached&quot;)
	cache.invalidate(part)
	assert(not cache.iscached(part), &quot;Part should not be cached&quot;)
end)

test(&quot;cache.replace&quot;, {}, function()
	local part = Instance.new(&quot;Part&quot;)
	local fire = Instance.new(&quot;Fire&quot;)
	cache.replace(part, fire)
	assert(part ~= fire, &quot;Part was not replaced with Fire&quot;)
end)

test(&quot;cloneref&quot;, {}, function()
	local part = Instance.new(&quot;Part&quot;)
	local clone = cloneref(part)
	assert(part ~= clone, &quot;Clone should not be equal to original&quot;)
	clone.Name = &quot;Test&quot;
	assert(part.Name == &quot;Test&quot;, &quot;Clone should have updated the original&quot;)
end)

test(&quot;compareinstances&quot;, {}, function()
	local part = Instance.new(&quot;Part&quot;)
	local clone = cloneref(part)
	assert(part ~= clone, &quot;Clone should not be equal to original&quot;)
	assert(compareinstances(part, clone), &quot;Clone should be equal to original when using compareinstances()&quot;)
end)

-- Closures

local function shallowEqual(t1, t2)
	if t1 == t2 then
		return true
	end

	local UNIQUE_TYPES = {
		[&quot;function&quot;] = true,
		[&quot;table&quot;] = true,
		[&quot;userdata&quot;] = true,
		[&quot;thread&quot;] = true,
	}

	for k, v in pairs(t1) do
		if UNIQUE_TYPES[type(v)] then
			if type(t2[k]) ~= type(v) then
				return false
			end
		elseif t2[k] ~= v then
			return false
		end
	end

	for k, v in pairs(t2) do
		if UNIQUE_TYPES[type(v)] then
			if type(t2[k]) ~= type(v) then
				return false
			end
		elseif t1[k] ~= v then
			return false
		end
	end

	return true
end

test(&quot;checkcaller&quot;, {}, function()
	assert(checkcaller(), &quot;Main scope should return true&quot;)
end)

test(&quot;clonefunction&quot;, {}, function()
	local function test()
		return &quot;success&quot;
	end
	local copy = clonefunction(test)
	assert(test() == copy(), &quot;The clone should return the same value as the original&quot;)
	assert(test ~= copy, &quot;The clone should not be equal to the original&quot;)
end)

test(&quot;getcallingscript&quot;, {})

test(&quot;getscriptclosure&quot;, {&quot;getscriptfunction&quot;}, function()
	local module = game:GetService(&quot;CoreGui&quot;).RobloxGui.Modules.Common.Constants
	local constants = getrenv().require(module)
	local generated = getscriptclosure(module)()
	assert(constants ~= generated, &quot;Generated module should not match the original&quot;)
	assert(shallowEqual(constants, generated), &quot;Generated constant table should be shallow equal to the original&quot;)
end)

test(&quot;hookfunction&quot;, {&quot;replaceclosure&quot;}, function()
	local function test()
		return true
	end
	local ref = hookfunction(test, function()
		return false
	end)
	assert(test() == false, &quot;Function should return false&quot;)
	assert(ref() == true, &quot;Original function should return true&quot;)
	assert(test ~= ref, &quot;Original function should not be same as the reference&quot;)
end)

test(&quot;iscclosure&quot;, {}, function()
	assert(iscclosure(print) == true, &quot;Function &#x27;print&#x27; should be a C closure&quot;)
	assert(iscclosure(function() end) == false, &quot;Executor function should not be a C closure&quot;)
end)

test(&quot;islclosure&quot;, {}, function()
	assert(islclosure(print) == false, &quot;Function &#x27;print&#x27; should not be a Lua closure&quot;)
	assert(islclosure(function() end) == true, &quot;Executor function should be a Lua closure&quot;)
end)

test(&quot;isexecutorclosure&quot;, {&quot;checkclosure&quot;, &quot;isourclosure&quot;}, function()
	assert(isexecutorclosure(isexecutorclosure) == true, &quot;Did not return true for an executor global&quot;)
	assert(isexecutorclosure(newcclosure(function() end)) == true, &quot;Did not return true for an executor C closure&quot;)
	assert(isexecutorclosure(function() end) == true, &quot;Did not return true for an executor Luau closure&quot;)
	assert(isexecutorclosure(print) == false, &quot;Did not return false for a Roblox global&quot;)
end)

test(&quot;loadstring&quot;, {}, function()
	local animate = game:GetService(&quot;Players&quot;).LocalPlayer.Character.Animate
	local bytecode = getscriptbytecode(animate)
	local func = loadstring(bytecode)
	assert(type(func) ~= &quot;function&quot;, &quot;Luau bytecode should not be loadable!&quot;)
	assert(assert(loadstring(&quot;return ... + 1&quot;))(1) == 2, &quot;Failed to do simple math&quot;)
	assert(type(select(2, loadstring(&quot;f&quot;))) == &quot;string&quot;, &quot;Loadstring did not return anything for a compiler error&quot;)
end)

test(&quot;newcclosure&quot;, {}, function()
	local function test()
		return true
	end
	local testC = newcclosure(test)
	assert(test() == testC(), &quot;New C closure should return the same value as the original&quot;)
	assert(test ~= testC, &quot;New C closure should not be same as the original&quot;)
	assert(iscclosure(testC), &quot;New C closure should be a C closure&quot;)
end)

-- Console

test(&quot;rconsoleclear&quot;, {&quot;consoleclear&quot;})

test(&quot;rconsolecreate&quot;, {&quot;consolecreate&quot;})

test(&quot;rconsoledestroy&quot;, {&quot;consoledestroy&quot;})

test(&quot;rconsoleinput&quot;, {&quot;consoleinput&quot;})

test(&quot;rconsoleprint&quot;, {&quot;consoleprint&quot;})

test(&quot;rconsolesettitle&quot;, {&quot;rconsolename&quot;, &quot;consolesettitle&quot;})

-- Crypt

test(&quot;crypt.base64encode&quot;, {&quot;crypt.base64.encode&quot;, &quot;crypt.base64_encode&quot;, &quot;base64.encode&quot;, &quot;base64_encode&quot;}, function()
	assert(crypt.base64encode(&quot;test&quot;) == &quot;dGVzdA==&quot;, &quot;Base64 encoding failed&quot;)
end)

test(&quot;crypt.base64decode&quot;, {&quot;crypt.base64.decode&quot;, &quot;crypt.base64_decode&quot;, &quot;base64.decode&quot;, &quot;base64_decode&quot;}, function()
	assert(crypt.base64decode(&quot;dGVzdA==&quot;) == &quot;test&quot;, &quot;Base64 decoding failed&quot;)
end)

test(&quot;crypt.encrypt&quot;, {}, function()
	local key = crypt.generatekey()
	local encrypted, iv = crypt.encrypt(&quot;test&quot;, key, nil, &quot;CBC&quot;)
	assert(iv, &quot;crypt.encrypt should return an IV&quot;)
	local decrypted = crypt.decrypt(encrypted, key, iv, &quot;CBC&quot;)
	assert(decrypted == &quot;test&quot;, &quot;Failed to decrypt raw string from encrypted data&quot;)
end)

test(&quot;crypt.decrypt&quot;, {}, function()
	local key, iv = crypt.generatekey(), crypt.generatekey()
	local encrypted = crypt.encrypt(&quot;test&quot;, key, iv, &quot;CBC&quot;)
	local decrypted = crypt.decrypt(encrypted, key, iv, &quot;CBC&quot;)
	assert(decrypted == &quot;test&quot;, &quot;Failed to decrypt raw string from encrypted data&quot;)
end)

test(&quot;crypt.generatebytes&quot;, {}, function()
	local size = math.random(10, 100)
	local bytes = crypt.generatebytes(size)
	assert(#crypt.base64decode(bytes) == size, &quot;The decoded result should be &quot; .. size .. &quot; bytes long (got &quot; .. #crypt.base64decode(bytes) .. &quot; decoded, &quot; .. #bytes .. &quot; raw)&quot;)
end)

test(&quot;crypt.generatekey&quot;, {}, function()
	local key = crypt.generatekey()
	assert(#crypt.base64decode(key) == 32, &quot;Generated key should be 32 bytes long when decoded&quot;)
end)

test(&quot;crypt.hash&quot;, {}, function()
	local algorithms = {&#x27;sha1&#x27;, &#x27;sha384&#x27;, &#x27;sha512&#x27;, &#x27;md5&#x27;, &#x27;sha256&#x27;, &#x27;sha3-224&#x27;, &#x27;sha3-256&#x27;, &#x27;sha3-512&#x27;}
	for _, algorithm in ipairs(algorithms) do
		local hash = crypt.hash(&quot;test&quot;, algorithm)
		assert(hash, &quot;crypt.hash on algorithm &#x27;&quot; .. algorithm .. &quot;&#x27; should return a hash&quot;)
	end
end)

--- Debug

test(&quot;debug.getconstant&quot;, {}, function()
	local function test()
		print(&quot;Hello, world!&quot;)
	end
	assert(debug.getconstant(test, 1) == &quot;print&quot;, &quot;First constant must be print&quot;)
	assert(debug.getconstant(test, 2) == nil, &quot;Second constant must be nil&quot;)
	assert(debug.getconstant(test, 3) == &quot;Hello, world!&quot;, &quot;Third constant must be &#x27;Hello, world!&#x27;&quot;)
end)

test(&quot;debug.getconstants&quot;, {}, function()
	local function test()
		local num = 5000 .. 50000
		print(&quot;Hello, world!&quot;, num, warn)
	end
	local constants = debug.getconstants(test)
	assert(constants[1] == 50000, &quot;First constant must be 50000&quot;)
	assert(constants[2] == &quot;print&quot;, &quot;Second constant must be print&quot;)
	assert(constants[3] == nil, &quot;Third constant must be nil&quot;)
	assert(constants[4] == &quot;Hello, world!&quot;, &quot;Fourth constant must be &#x27;Hello, world!&#x27;&quot;)
	assert(constants[5] == &quot;warn&quot;, &quot;Fifth constant must be warn&quot;)
end)

test(&quot;debug.getinfo&quot;, {}, function()
	local types = {
		source = &quot;string&quot;,
		short_src = &quot;string&quot;,
		func = &quot;function&quot;,
		what = &quot;string&quot;,
		currentline = &quot;number&quot;,
		name = &quot;string&quot;,
		nups = &quot;number&quot;,
		numparams = &quot;number&quot;,
		is_vararg = &quot;number&quot;,
	}
	local function test(...)
		print(...)
	end
	local info = debug.getinfo(test)
	for k, v in pairs(types) do
		assert(info[k] ~= nil, &quot;Did not return a table with a &#x27;&quot; .. k .. &quot;&#x27; field&quot;)
		assert(type(info[k]) == v, &quot;Did not return a table with &quot; .. k .. &quot; as a &quot; .. v .. &quot; (got &quot; .. type(info[k]) .. &quot;)&quot;)
	end
end)

test(&quot;debug.getproto&quot;, {}, function()
	local function test()
		local function proto()
			return true
		end
	end
	local proto = debug.getproto(test, 1, true)[1]
	local realproto = debug.getproto(test, 1)
	assert(proto, &quot;Failed to get the inner function&quot;)
	assert(proto() == true, &quot;The inner function did not return anything&quot;)
	if not realproto() then
		return &quot;Proto return values are disabled on this executor&quot;
	end
end)

test(&quot;debug.getprotos&quot;, {}, function()
	local function test()
		local function _1()
			return true
		end
		local function _2()
			return true
		end
		local function _3()
			return true
		end
	end
	for i in ipairs(debug.getprotos(test)) do
		local proto = debug.getproto(test, i, true)[1]
		local realproto = debug.getproto(test, i)
		assert(proto(), &quot;Failed to get inner function &quot; .. i)
		if not realproto() then
			return &quot;Proto return values are disabled on this executor&quot;
		end
	end
end)

test(&quot;debug.getstack&quot;, {}, function()
	local _ = &quot;a&quot; .. &quot;b&quot;
	assert(debug.getstack(1, 1) == &quot;ab&quot;, &quot;The first item in the stack should be &#x27;ab&#x27;&quot;)
	assert(debug.getstack(1)[1] == &quot;ab&quot;, &quot;The first item in the stack table should be &#x27;ab&#x27;&quot;)
end)

test(&quot;debug.getupvalue&quot;, {}, function()
	local upvalue = function() end
	local function test()
		print(upvalue)
	end
	assert(debug.getupvalue(test, 1) == upvalue, &quot;Unexpected value returned from debug.getupvalue&quot;)
end)

test(&quot;debug.getupvalues&quot;, {}, function()
	local upvalue = function() end
	local function test()
		print(upvalue)
	end
	local upvalues = debug.getupvalues(test)
	assert(upvalues[1] == upvalue, &quot;Unexpected value returned from debug.getupvalues&quot;)
end)

test(&quot;debug.setconstant&quot;, {}, function()
	local function test()
		return &quot;fail&quot;
	end
	debug.setconstant(test, 1, &quot;success&quot;)
	assert(test() == &quot;success&quot;, &quot;debug.setconstant did not set the first constant&quot;)
end)

test(&quot;debug.setstack&quot;, {}, function()
	local function test()
		return &quot;fail&quot;, debug.setstack(1, 1, &quot;success&quot;)
	end
	assert(test() == &quot;success&quot;, &quot;debug.setstack did not set the first stack item&quot;)
end)

test(&quot;debug.setupvalue&quot;, {}, function()
	local function upvalue()
		return &quot;fail&quot;
	end
	local function test()
		return upvalue()
	end
	debug.setupvalue(test, 1, function()
		return &quot;success&quot;
	end)
	assert(test() == &quot;success&quot;, &quot;debug.setupvalue did not set the first upvalue&quot;)
end)

-- Filesystem

if isfolder and makefolder and delfolder then
	if isfolder(&quot;.tests&quot;) then
		delfolder(&quot;.tests&quot;)
	end
	makefolder(&quot;.tests&quot;)
end

test(&quot;readfile&quot;, {}, function()
	writefile(&quot;.tests/readfile.txt&quot;, &quot;success&quot;)
	assert(readfile(&quot;.tests/readfile.txt&quot;) == &quot;success&quot;, &quot;Did not return the contents of the file&quot;)
end)

test(&quot;listfiles&quot;, {}, function()
	makefolder(&quot;.tests/listfiles&quot;)
	writefile(&quot;.tests/listfiles/test_1.txt&quot;, &quot;success&quot;)
	writefile(&quot;.tests/listfiles/test_2.txt&quot;, &quot;success&quot;)
	local files = listfiles(&quot;.tests/listfiles&quot;)
	assert(#files == 2, &quot;Did not return the correct number of files&quot;)
	assert(isfile(files[1]), &quot;Did not return a file path&quot;)
	assert(readfile(files[1]) == &quot;success&quot;, &quot;Did not return the correct files&quot;)
	makefolder(&quot;.tests/listfiles_2&quot;)
	makefolder(&quot;.tests/listfiles_2/test_1&quot;)
	makefolder(&quot;.tests/listfiles_2/test_2&quot;)
	local folders = listfiles(&quot;.tests/listfiles_2&quot;)
	assert(#folders == 2, &quot;Did not return the correct number of folders&quot;)
	assert(isfolder(folders[1]), &quot;Did not return a folder path&quot;)
end)

test(&quot;writefile&quot;, {}, function()
	writefile(&quot;.tests/writefile.txt&quot;, &quot;success&quot;)
	assert(readfile(&quot;.tests/writefile.txt&quot;) == &quot;success&quot;, &quot;Did not write the file&quot;)
	local requiresFileExt = pcall(function()
		writefile(&quot;.tests/writefile&quot;, &quot;success&quot;)
		assert(isfile(&quot;.tests/writefile.txt&quot;))
	end)
	if not requiresFileExt then
		return &quot;This executor requires a file extension in writefile&quot;
	end
end)

test(&quot;makefolder&quot;, {}, function()
	makefolder(&quot;.tests/makefolder&quot;)
	assert(isfolder(&quot;.tests/makefolder&quot;), &quot;Did not create the folder&quot;)
end)

test(&quot;appendfile&quot;, {}, function()
	writefile(&quot;.tests/appendfile.txt&quot;, &quot;su&quot;)
	appendfile(&quot;.tests/appendfile.txt&quot;, &quot;cce&quot;)
	appendfile(&quot;.tests/appendfile.txt&quot;, &quot;ss&quot;)
	assert(readfile(&quot;.tests/appendfile.txt&quot;) == &quot;success&quot;, &quot;Did not append the file&quot;)
end)

test(&quot;isfile&quot;, {}, function()
	writefile(&quot;.tests/isfile.txt&quot;, &quot;success&quot;)
	assert(isfile(&quot;.tests/isfile.txt&quot;) == true, &quot;Did not return true for a file&quot;)
	assert(isfile(&quot;.tests&quot;) == false, &quot;Did not return false for a folder&quot;)
	assert(isfile(&quot;.tests/doesnotexist.exe&quot;) == false, &quot;Did not return false for a nonexistent path (got &quot; .. tostring(isfile(&quot;.tests/doesnotexist.exe&quot;)) .. &quot;)&quot;)
end)

test(&quot;isfolder&quot;, {}, function()
	assert(isfolder(&quot;.tests&quot;) == true, &quot;Did not return false for a folder&quot;)
	assert(isfolder(&quot;.tests/doesnotexist.exe&quot;) == false, &quot;Did not return false for a nonexistent path (got &quot; .. tostring(isfolder(&quot;.tests/doesnotexist.exe&quot;)) .. &quot;)&quot;)
end)

test(&quot;delfolder&quot;, {}, function()
	makefolder(&quot;.tests/delfolder&quot;)
	delfolder(&quot;.tests/delfolder&quot;)
	assert(isfolder(&quot;.tests/delfolder&quot;) == false, &quot;Failed to delete folder (isfolder = &quot; .. tostring(isfolder(&quot;.tests/delfolder&quot;)) .. &quot;)&quot;)
end)

test(&quot;delfile&quot;, {}, function()
	writefile(&quot;.tests/delfile.txt&quot;, &quot;Hello, world!&quot;)
	delfile(&quot;.tests/delfile.txt&quot;)
	assert(isfile(&quot;.tests/delfile.txt&quot;) == false, &quot;Failed to delete file (isfile = &quot; .. tostring(isfile(&quot;.tests/delfile.txt&quot;)) .. &quot;)&quot;)
end)

test(&quot;loadfile&quot;, {}, function()
	writefile(&quot;.tests/loadfile.txt&quot;, &quot;return ... + 1&quot;)
	assert(assert(loadfile(&quot;.tests/loadfile.txt&quot;))(1) == 2, &quot;Failed to load a file with arguments&quot;)
	writefile(&quot;.tests/loadfile.txt&quot;, &quot;f&quot;)
	local callback, err = loadfile(&quot;.tests/loadfile.txt&quot;)
	assert(err and not callback, &quot;Did not return an error message for a compiler error&quot;)
end)

test(&quot;dofile&quot;, {})

-- Input

test(&quot;isrbxactive&quot;, {&quot;isgameactive&quot;}, function()
	assert(type(isrbxactive()) == &quot;boolean&quot;, &quot;Did not return a boolean value&quot;)
end)

test(&quot;mouse1click&quot;, {})

test(&quot;mouse1press&quot;, {})

test(&quot;mouse1release&quot;, {})

test(&quot;mouse2click&quot;, {})

test(&quot;mouse2press&quot;, {})

test(&quot;mouse2release&quot;, {})

test(&quot;mousemoveabs&quot;, {})

test(&quot;mousemoverel&quot;, {})

test(&quot;mousescroll&quot;, {})

-- Instances

test(&quot;fireclickdetector&quot;, {}, function()
	local detector = Instance.new(&quot;ClickDetector&quot;)
	fireclickdetector(detector, 50, &quot;MouseHoverEnter&quot;)
end)

test(&quot;getcallbackvalue&quot;, {}, function()
	local bindable = Instance.new(&quot;BindableFunction&quot;)
	local function test()
	end
	bindable.OnInvoke = test
	assert(getcallbackvalue(bindable, &quot;OnInvoke&quot;) == test, &quot;Did not return the correct value&quot;)
end)

test(&quot;getconnections&quot;, {}, function()
	local types = {
		Enabled = &quot;boolean&quot;,
		ForeignState = &quot;boolean&quot;,
		LuaConnection = &quot;boolean&quot;,
		Function = &quot;function&quot;,
		Thread = &quot;thread&quot;,
		Fire = &quot;function&quot;,
		Defer = &quot;function&quot;,
		Disconnect = &quot;function&quot;,
		Disable = &quot;function&quot;,
		Enable = &quot;function&quot;,
	}
	local bindable = Instance.new(&quot;BindableEvent&quot;)
	bindable.Event:Connect(function() end)
	local connection = getconnections(bindable.Event)[1]
	for k, v in pairs(types) do
		assert(connection[k] ~= nil, &quot;Did not return a table with a &#x27;&quot; .. k .. &quot;&#x27; field&quot;)
		assert(type(connection[k]) == v, &quot;Did not return a table with &quot; .. k .. &quot; as a &quot; .. v .. &quot; (got &quot; .. type(connection[k]) .. &quot;)&quot;)
	end
end)

test(&quot;getcustomasset&quot;, {}, function()
	writefile(&quot;.tests/getcustomasset.txt&quot;, &quot;success&quot;)
	local contentId = getcustomasset(&quot;.tests/getcustomasset.txt&quot;)
	assert(type(contentId) == &quot;string&quot;, &quot;Did not return a string&quot;)
	assert(#contentId &gt; 0, &quot;Returned an empty string&quot;)
	assert(string.match(contentId, &quot;rbxasset://&quot;) == &quot;rbxasset://&quot;, &quot;Did not return an rbxasset url&quot;)
end)

test(&quot;gethiddenproperty&quot;, {}, function()
	local fire = Instance.new(&quot;Fire&quot;)
	local property, isHidden = gethiddenproperty(fire, &quot;size_xml&quot;)
	assert(property == 5, &quot;Did not return the correct value&quot;)
	assert(isHidden == true, &quot;Did not return whether the property was hidden&quot;)
end)

test(&quot;sethiddenproperty&quot;, {}, function()
	local fire = Instance.new(&quot;Fire&quot;)
	local hidden = sethiddenproperty(fire, &quot;size_xml&quot;, 10)
	assert(hidden, &quot;Did not return true for the hidden property&quot;)
	assert(gethiddenproperty(fire, &quot;size_xml&quot;) == 10, &quot;Did not set the hidden property&quot;)
end)

test(&quot;gethui&quot;, {}, function()
	assert(typeof(gethui()) == &quot;Instance&quot;, &quot;Did not return an Instance&quot;)
end)

test(&quot;getinstances&quot;, {}, function()
	assert(getinstances()[1]:IsA(&quot;Instance&quot;), &quot;The first value is not an Instance&quot;)
end)

test(&quot;getnilinstances&quot;, {}, function()
	assert(getnilinstances()[1]:IsA(&quot;Instance&quot;), &quot;The first value is not an Instance&quot;)
	assert(getnilinstances()[1].Parent == nil, &quot;The first value is not parented to nil&quot;)
end)

test(&quot;isscriptable&quot;, {}, function()
	local fire = Instance.new(&quot;Fire&quot;)
	assert(isscriptable(fire, &quot;size_xml&quot;) == false, &quot;Did not return false for a non-scriptable property (size_xml)&quot;)
	assert(isscriptable(fire, &quot;Size&quot;) == true, &quot;Did not return true for a scriptable property (Size)&quot;)
end)

test(&quot;setscriptable&quot;, {}, function()
	local fire = Instance.new(&quot;Fire&quot;)
	local wasScriptable = setscriptable(fire, &quot;size_xml&quot;, true)
	assert(wasScriptable == false, &quot;Did not return false for a non-scriptable property (size_xml)&quot;)
	assert(isscriptable(fire, &quot;size_xml&quot;) == true, &quot;Did not set the scriptable property&quot;)
	fire = Instance.new(&quot;Fire&quot;)
	assert(isscriptable(fire, &quot;size_xml&quot;) == false, &quot;⚠️⚠️ setscriptable persists between unique instances ⚠️⚠️&quot;)
end)

test(&quot;setrbxclipboard&quot;, {})

-- Metatable

test(&quot;getrawmetatable&quot;, {}, function()
	local metatable = { __metatable = &quot;Locked!&quot; }
	local object = setmetatable({}, metatable)
	assert(getrawmetatable(object) == metatable, &quot;Did not return the metatable&quot;)
end)

test(&quot;hookmetamethod&quot;, {}, function()
	local object = setmetatable({}, { __index = newcclosure(function() return false end), __metatable = &quot;Locked!&quot; })
	local ref = hookmetamethod(object, &quot;__index&quot;, function() return true end)
	assert(object.test == true, &quot;Failed to hook a metamethod and change the return value&quot;)
	assert(ref() == false, &quot;Did not return the original function&quot;)
end)

test(&quot;getnamecallmethod&quot;, {}, function()
	local method
	local ref
	ref = hookmetamethod(game, &quot;__namecall&quot;, function(...)
		if not method then
			method = getnamecallmethod()
		end
		return ref(...)
	end)
	game:GetService(&quot;Lighting&quot;)
	assert(method == &quot;GetService&quot;, &quot;Did not get the correct method (GetService)&quot;)
end)

test(&quot;isreadonly&quot;, {}, function()
	local object = {}
	table.freeze(object)
	assert(isreadonly(object), &quot;Did not return true for a read-only table&quot;)
end)

test(&quot;setrawmetatable&quot;, {}, function()
	local object = setmetatable({}, { __index = function() return false end, __metatable = &quot;Locked!&quot; })
	local objectReturned = setrawmetatable(object, { __index = function() return true end })
	assert(object, &quot;Did not return the original object&quot;)
	assert(object.test == true, &quot;Failed to change the metatable&quot;)
	if objectReturned then
		return objectReturned == object and &quot;Returned the original object&quot; or &quot;Did not return the original object&quot;
	end
end)

test(&quot;setreadonly&quot;, {}, function()
	local object = { success = false }
	table.freeze(object)
	setreadonly(object, false)
	object.success = true
	assert(object.success, &quot;Did not allow the table to be modified&quot;)
end)

-- Miscellaneous

test(&quot;identifyexecutor&quot;, {&quot;getexecutorname&quot;}, function()
	local name, version = identifyexecutor()
	assert(type(name) == &quot;string&quot;, &quot;Did not return a string for the name&quot;)
	return type(version) == &quot;string&quot; and &quot;Returns version as a string&quot; or &quot;Does not return version&quot;
end)

test(&quot;lz4compress&quot;, {}, function()
	local raw = &quot;Hello, world!&quot;
	local compressed = lz4compress(raw)
	assert(type(compressed) == &quot;string&quot;, &quot;Compression did not return a string&quot;)
	assert(lz4decompress(compressed, #raw) == raw, &quot;Decompression did not return the original string&quot;)
end)

test(&quot;lz4decompress&quot;, {}, function()
	local raw = &quot;Hello, world!&quot;
	local compressed = lz4compress(raw)
	assert(type(compressed) == &quot;string&quot;, &quot;Compression did not return a string&quot;)
	assert(lz4decompress(compressed, #raw) == raw, &quot;Decompression did not return the original string&quot;)
end)

test(&quot;messagebox&quot;, {})

test(&quot;queue_on_teleport&quot;, {&quot;queueonteleport&quot;})

test(&quot;request&quot;, {&quot;http.request&quot;, &quot;http_request&quot;}, function()
	local response = request({
		Url = &quot;https://httpbin.org/user-agent&quot;,
		Method = &quot;GET&quot;,
	})
	assert(type(response) == &quot;table&quot;, &quot;Response must be a table&quot;)
	assert(response.StatusCode == 200, &quot;Did not return a 200 status code&quot;)
	local data = game:GetService(&quot;HttpService&quot;):JSONDecode(response.Body)
	assert(type(data) == &quot;table&quot; and type(data[&quot;user-agent&quot;]) == &quot;string&quot;, &quot;Did not return a table with a user-agent key&quot;)
	return &quot;User-Agent: &quot; .. data[&quot;user-agent&quot;]
end)

test(&quot;setclipboard&quot;, {&quot;toclipboard&quot;})

test(&quot;setfpscap&quot;, {}, function()
	local renderStepped = game:GetService(&quot;RunService&quot;).RenderStepped
	local function step()
		renderStepped:Wait()
		local sum = 0
		for _ = 1, 5 do
			sum = sum + 1 / renderStepped:Wait()
		end
		return math.round(sum / 5)
	end
	setfpscap(60)
	local step60 = step()
	setfpscap(0)
	local step0 = step()
	return step60 .. &quot;fps @60 • &quot; .. step0 .. &quot;fps @0&quot;
end)

-- Scripts

test(&quot;getgc&quot;, {}, function()
	local gc = getgc()
	assert(type(gc) == &quot;table&quot;, &quot;Did not return a table&quot;)
	assert(#gc &gt; 0, &quot;Did not return a table with any values&quot;)
end)

test(&quot;getgenv&quot;, {}, function()
	getgenv().__TEST_GLOBAL = true
	assert(__TEST_GLOBAL, &quot;Failed to set a global variable&quot;)
	getgenv().__TEST_GLOBAL = nil
end)

test(&quot;getloadedmodules&quot;, {}, function()
	local modules = getloadedmodules()
	assert(type(modules) == &quot;table&quot;, &quot;Did not return a table&quot;)
	assert(#modules &gt; 0, &quot;Did not return a table with any values&quot;)
	assert(typeof(modules[1]) == &quot;Instance&quot;, &quot;First value is not an Instance&quot;)
	assert(modules[1]:IsA(&quot;ModuleScript&quot;), &quot;First value is not a ModuleScript&quot;)
end)

test(&quot;getrenv&quot;, {}, function()
	assert(_G ~= getrenv()._G, &quot;The variable _G in the executor is identical to _G in the game&quot;)
end)

test(&quot;getrunningscripts&quot;, {}, function()
	local scripts = getrunningscripts()
	assert(type(scripts) == &quot;table&quot;, &quot;Did not return a table&quot;)
	assert(#scripts &gt; 0, &quot;Did not return a table with any values&quot;)
	assert(typeof(scripts[1]) == &quot;Instance&quot;, &quot;First value is not an Instance&quot;)
	assert(scripts[1]:IsA(&quot;ModuleScript&quot;) or scripts[1]:IsA(&quot;LocalScript&quot;), &quot;First value is not a ModuleScript or LocalScript&quot;)
end)

test(&quot;getscriptbytecode&quot;, {&quot;dumpstring&quot;}, function()
	local animate = game:GetService(&quot;Players&quot;).LocalPlayer.Character.Animate
	local bytecode = getscriptbytecode(animate)
	assert(type(bytecode) == &quot;string&quot;, &quot;Did not return a string for Character.Animate (a &quot; .. animate.ClassName .. &quot;)&quot;)
end)

test(&quot;getscripthash&quot;, {}, function()
	local animate = game:GetService(&quot;Players&quot;).LocalPlayer.Character.Animate:Clone()
	local hash = getscripthash(animate)
	local source = animate.Source
	animate.Source = &quot;print(&#x27;Hello, world!&#x27;)&quot;
	task.defer(function()
		animate.Source = source
	end)
	local newHash = getscripthash(animate)
	assert(hash ~= newHash, &quot;Did not return a different hash for a modified script&quot;)
	assert(newHash == getscripthash(animate), &quot;Did not return the same hash for a script with the same source&quot;)
end)

test(&quot;getscripts&quot;, {}, function()
	local scripts = getscripts()
	assert(type(scripts) == &quot;table&quot;, &quot;Did not return a table&quot;)
	assert(#scripts &gt; 0, &quot;Did not return a table with any values&quot;)
	assert(typeof(scripts[1]) == &quot;Instance&quot;, &quot;First value is not an Instance&quot;)
	assert(scripts[1]:IsA(&quot;ModuleScript&quot;) or scripts[1]:IsA(&quot;LocalScript&quot;), &quot;First value is not a ModuleScript or LocalScript&quot;)
end)

test(&quot;getsenv&quot;, {}, function()
	local animate = game:GetService(&quot;Players&quot;).LocalPlayer.Character.Animate
	local env = getsenv(animate)
	assert(type(env) == &quot;table&quot;, &quot;Did not return a table for Character.Animate (a &quot; .. animate.ClassName .. &quot;)&quot;)
	assert(env.script == animate, &quot;The script global is not identical to Character.Animate&quot;)
end)

test(&quot;getthreadidentity&quot;, {&quot;getidentity&quot;, &quot;getthreadcontext&quot;}, function()
	assert(type(getthreadidentity()) == &quot;number&quot;, &quot;Did not return a number&quot;)
end)

test(&quot;setthreadidentity&quot;, {&quot;setidentity&quot;, &quot;setthreadcontext&quot;}, function()
	setthreadidentity(3)
	assert(getthreadidentity() == 3, &quot;Did not set the thread identity&quot;)
end)

-- Drawing

test(&quot;Drawing&quot;, {})

test(&quot;Drawing.new&quot;, {}, function()
	local drawing = Drawing.new(&quot;Square&quot;)
	drawing.Visible = false
	local canDestroy = pcall(function()
		drawing:Destroy()
	end)
	assert(canDestroy, &quot;Drawing:Destroy() should not throw an error&quot;)
end)

test(&quot;Drawing.Fonts&quot;, {}, function()
	assert(Drawing.Fonts.UI == 0, &quot;Did not return the correct id for UI&quot;)
	assert(Drawing.Fonts.System == 1, &quot;Did not return the correct id for System&quot;)
	assert(Drawing.Fonts.Plex == 2, &quot;Did not return the correct id for Plex&quot;)
	assert(Drawing.Fonts.Monospace == 3, &quot;Did not return the correct id for Monospace&quot;)
end)

test(&quot;isrenderobj&quot;, {}, function()
	local drawing = Drawing.new(&quot;Image&quot;)
	drawing.Visible = true
	assert(isrenderobj(drawing) == true, &quot;Did not return true for an Image&quot;)
	assert(isrenderobj(newproxy()) == false, &quot;Did not return false for a blank table&quot;)
end)

test(&quot;getrenderproperty&quot;, {}, function()
	local drawing = Drawing.new(&quot;Image&quot;)
	drawing.Visible = true
	assert(type(getrenderproperty(drawing, &quot;Visible&quot;)) == &quot;boolean&quot;, &quot;Did not return a boolean value for Image.Visible&quot;)
	local success, result = pcall(function()
		return getrenderproperty(drawing, &quot;Color&quot;)
	end)
	if not success or not result then
		return &quot;Image.Color is not supported&quot;
	end
end)

test(&quot;setrenderproperty&quot;, {}, function()
	local drawing = Drawing.new(&quot;Square&quot;)
	drawing.Visible = true
	setrenderproperty(drawing, &quot;Visible&quot;, false)
	assert(drawing.Visible == false, &quot;Did not set the value for Square.Visible&quot;)
end)

test(&quot;cleardrawcache&quot;, {}, function()
	cleardrawcache()
end)

-- WebSocket

test(&quot;WebSocket&quot;, {})

test(&quot;WebSocket.connect&quot;, {}, function()
	local types = {
		Send = &quot;function&quot;,
		Close = &quot;function&quot;,
		OnMessage = {&quot;table&quot;, &quot;userdata&quot;},
		OnClose = {&quot;table&quot;, &quot;userdata&quot;},
	}
	local ws = WebSocket.connect(&quot;ws://echo.websocket.events&quot;)
	assert(type(ws) == &quot;table&quot; or type(ws) == &quot;userdata&quot;, &quot;Did not return a table or userdata&quot;)
	for k, v in pairs(types) do
		if type(v) == &quot;table&quot; then
			assert(table.find(v, type(ws[k])), &quot;Did not return a &quot; .. table.concat(v, &quot;, &quot;) .. &quot; for &quot; .. k .. &quot; (a &quot; .. type(ws[k]) .. &quot;)&quot;)
		else
			assert(type(ws[k]) == v, &quot;Did not return a &quot; .. v .. &quot; for &quot; .. k .. &quot; (a &quot; .. type(ws[k]) .. &quot;)&quot;)
		end
	end
	ws:Close()
end)
local str = (&quot;Executed with %d fails, %d passes, %d undefineds&quot;):format(fails, passes, undefined)
print(str)</pre>

]]></content:encoded></item></channel></rss>