Skip to content
Open
4 changes: 2 additions & 2 deletions src/io/files.js
Original file line number Diff line number Diff line change
Expand Up @@ -1669,13 +1669,13 @@ function files(p5, fn) {
fn.saveJSON(args[0], args[1], args[2]);
return;
case 'txt':
fn.saveStrings(args[0], args[1], args[2]);
fn.saveStrings(args[0], args[1], 'txt', args[2]);
return;
// =================================================
// OPTION 3: decide based on object...
default:
if (args[0] instanceof Array) {
fn.saveStrings(args[0], args[1], args[2]);
fn.saveStrings(args[0], args[1], undefined, args[2]);
} else if (args[0] instanceof p5.Table) {
fn.saveTable(args[0], args[1], args[2]);
} else if (args[0] instanceof p5.Image) {
Expand Down
24 changes: 23 additions & 1 deletion test/unit/io/files.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { vi } from 'vitest';
const mockAnchorElement = vi.mockObject({
href: null,
download: null,
click: () => {}
click: () => { }
});
const originalCreateElement = document.createElement;
vi.spyOn(document, 'createElement').mockImplementation((...args) => {
Expand Down Expand Up @@ -191,6 +191,28 @@ suite('Files', function () {
assert.equal(mockAnchorElement.download, 'filename.txt');
});

test('should preserve CRLF when saving a text file without an extension', async () => {
const myStrings = ['aaa', 'bbb'];
mockP5Prototype.save(myStrings, 'filename', true);

const saveData = new Blob([myStrings.join('\r\n')]);
expect(document.createElement).toHaveBeenCalledTimes(1);
expect(mockAnchorElement.click).toHaveBeenCalledTimes(1);
expect(URL.createObjectURL).toHaveBeenCalledWith(saveData);
assert.equal(mockAnchorElement.download, 'filename.txt');
});

test('should preserve CRLF when saving a text file', async () => {
const myStrings = ['aaa', 'bbb'];
mockP5Prototype.save(myStrings, 'filename.txt', true);

const saveData = new Blob([myStrings.join('\r\n')]);
expect(document.createElement).toHaveBeenCalledTimes(1);
expect(mockAnchorElement.click).toHaveBeenCalledTimes(1);
expect(URL.createObjectURL).toHaveBeenCalledWith(saveData);
assert.equal(mockAnchorElement.download, 'filename.txt');
});

test('should download a json file', async () => {
const myObj = { hi: 'hello' };
mockP5Prototype.save(myObj, 'filename.json');
Expand Down